Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / HashMap - повторы значений / 25 сообщений из 45, страница 1 из 2
16.02.2013, 23:25
    #38154256
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
Нужно убрать все повторяющиеся записи, и вроде все работает.
Проблема в том, что если в записи с ("sd", "Oleg") написать ("sd1", "Oleg"), то метод будет работать неверно...

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
import java.util.HashMap;
import java.util.Map;

public class Solution_2
{
    public static HashMap<String, String> createMap()
    {
    	HashMap<String, String> hm= new HashMap<String, String>();

    	hm.put("qwe", "Igor");
    	hm.put("qweasd", "Igor");
    	hm.put("sd", "Oleg");
    	hm.put("asd", "Petr");
    	hm.put("zxc", "Petr");
    	hm.put("qwwe", "Igor");
    	hm.put("fda", "Semen");
    	hm.put("gda", "Semen");
    	hm.put("hda", "Semen");
    	hm.put("jda", "Semen");

        return hm;
    }

    public static void removeTheFirstNameDuplicates(HashMap<String, String> map)
    {
        
        for(int i=0; i<map.size(); i++){
    		
        	int count=0; 
    		String currentName; 
    		String tempName="";
    		Boolean chek = false;
    		
	        for (Map.Entry<String, String> pair: map.entrySet())
	        {
	        	
	        	currentName=pair.getValue();
	        	System.out.println("currentName = " + currentName);
	        	if (!chek) { tempName=currentName; chek = true; }
	        	if (currentName.equals(tempName)) count++;
	        }
	        System.out.println("Current count = " + count);
	        // запуск очистки, если больше одного повтора
	        if(count > 1) {
	        	System.out.println("запускаю очистку по "+ tempName);
	        	removeItemFromMapByValue(map, tempName);
	        }
	        if((map.size())==1) break;
        }
    }
    
    public static void removeItemFromMapByValue(HashMap<String, String> map, String value)
    {
        HashMap<String, String> copy = new HashMap<String, String>(map);
        for (Map.Entry<String, String> pair: copy.entrySet())
        {
            if (pair.getValue().equals(value))
                map.remove(pair.getKey());
        }
    }
    
    public static void main(String[] args) {
		HashMap<String, String> map=createMap();
		removeTheFirstNameDuplicates(map);
		System.out.println(map);
	}
}
...
Рейтинг: 0 / 0
16.02.2013, 23:36
    #38154262
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
rema174,

а по какому принципу определить, какого из них убрать?
Код: java
1.
2.
3.
4.
        hm.put("fda", "Semen");
    	hm.put("gda", "Semen");
    	hm.put("hda", "Semen");
    	hm.put("jda", "Semen");
...
Рейтинг: 0 / 0
16.02.2013, 23:45
    #38154266
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
rema174,
Вот решение в лоб, зато простое и понятное
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
public class MapCleaner {
   public static void clean(){
       HashMap<String, String> hm= new HashMap<>();

    	hm.put("qwe", "Igor");
    	hm.put("qweasd", "Igor");
    	hm.put("sd", "Oleg");
    	hm.put("asd", "Petr");
    	hm.put("zxc", "Petr");
    	hm.put("qwwe", "Igor");
    	hm.put("fda", "Semen");
    	hm.put("gda", "Semen");
    	hm.put("hda", "Semen");
    	hm.put("jda", "Semen");
        
        List<String> duplicates = new ArrayList<>();
        List<String> keys = new ArrayList<>();
       
        for(Map.Entry<String,String> entry:hm.entrySet()){
            if(duplicates.contains(entry.getValue())){
                keys.add(entry.getKey());
            }else{
                duplicates.add(entry.getValue());
            }
        }
        
        for(String key:keys){
            hm.remove(key);
        }
        System.out.println(hm);
    
   }

}
...
Рейтинг: 0 / 0
16.02.2013, 23:52
    #38154271
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
javapecker,

+1

rema174,

Все бы ничего, но как вы собираетесь найти TheFirstName .
...
Рейтинг: 0 / 0
16.02.2013, 23:53
    #38154272
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
javapeckerrema174,

а по какому принципу определить, какого из них убрать?
Код: java
1.
2.
3.
4.
        hm.put("fda", "Semen");
    	hm.put("gda", "Semen");
    	hm.put("hda", "Semen");
    	hm.put("jda", "Semen");




разные ключи - разные записи, убрать все потворы по именам, т.е. всех семенов
...
Рейтинг: 0 / 0
16.02.2013, 23:54
    #38154274
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
rema174,
но один должен остаться, кто это будет?
...
Рейтинг: 0 / 0
16.02.2013, 23:56
    #38154276
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
Все бы ничего, но как вы собираетесь найти TheFirstName .[/quot]
Что вы понимате под TheFirstName?
Это часть имени метода, а метод должен почистить все дупликаты по именам.
...
Рейтинг: 0 / 0
16.02.2013, 23:57
    #38154278
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
javapeckerrema174,
но один должен остаться, кто это будет?

нет, все семены должны уйти
...
Рейтинг: 0 / 0
16.02.2013, 23:58
    #38154280
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
rema174,
то есть из вашего набора вообще только Oleg должен остаться?
...
Рейтинг: 0 / 0
17.02.2013, 00:04
    #38154283
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
rema174Что вы понимате под TheFirstName?
Это часть имени метода, а метод должен почистить все дупликаты по именам.

Порядок добавления в мэп не совпадет с порядком итерирования коллекции,
отсюда - невозможно узнать, какое имя будет первым.

Или все же 13937484 ?
...
Рейтинг: 0 / 0
17.02.2013, 00:06
    #38154286
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
javapeckerrema174,
то есть из вашего набора вообще только Oleg должен остаться?

В данном случае, да.
Набор значений - это частный пример.
Если еще добавить
Код: java
1.
hm.put("zsd1", "Zidan");


то останутся Oleg и Zidan.
Но если написать (" zsd ", "Zidan"), то уже не верно будет....
...
Рейтинг: 0 / 0
17.02.2013, 00:08
    #38154288
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
rema174,
скажите, а где может найти применение такое жестокое уничтожение дубликатов?
...
Рейтинг: 0 / 0
17.02.2013, 00:11
    #38154291
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
Порядок добавления в мэп не совпадет с порядком итерирования коллекции,
отсюда - невозможно узнать, какое имя будет первым.

Или все же 13937484 ?

В данном случае не важно какое имя будет первым, предполагается что метод должен убрать всех дубликатов, если в value все "семены", то никого и не останется.
...
Рейтинг: 0 / 0
17.02.2013, 00:13
    #38154293
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
javapeckerrema174,
скажите, а где может найти применение такое жестокое уничтожение дубликатов?

это задача такая, условие не я придумал :-) кроме того, последний метод уже был задан
...
Рейтинг: 0 / 0
17.02.2013, 00:16
    #38154294
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
javapecker, ваше решение мне понятно, спасибо, но условие было другое
...
Рейтинг: 0 / 0
17.02.2013, 00:22
    #38154297
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
rema174,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Map<String, String> hm = new HashMap<String, String>() {
    Map<String, String> map = new HashMap<String, String>();

    @Override
    public String put(String key, String value) {
        if (map.containsKey(value)) {
            String k = map.get(value).toString();
            return super.remove(k);
        }
        map.put(value, key);
        return super.put(key, value);
    }
};

hm.put("qwe", "Igor");
hm.put("qweasd", "Igor");
hm.put("sd", "Oleg");
hm.put("asd", "Petr");
hm.put("zxc", "Petr");
hm.put("qwwe", "Igor");
hm.put("fda", "Semen");
hm.put("gda", "Semen");
hm.put("hda", "Semen");
hm.put("jda", "Semen");

for (Map.Entry<String, String> kv: hm.entrySet()) {
    System.out.format("[%s] = %s\n", kv.getKey(), kv.getValue());
}
...
Рейтинг: 0 / 0
17.02.2013, 00:26
    #38154300
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
rema174,
если мое решение понятно, то должно быть понятно и то, что из него прямо вытекает решение которое удовлетворяет вашим условиям:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
public class MapCleaner {

    public static void clean() {
        HashMap<String, String> hm = new HashMap<>();

        hm.put("qwe", "Igor");
        hm.put("qweasd", "Igor");
        hm.put("sd1", "Oleg");
        hm.put("asd", "Petr");
        hm.put("zxc", "Petr");
        hm.put("qwwe", "Igor");
        hm.put("fda", "Semen");
        hm.put("gda", "Semen");
        hm.put("hda", "Semen");
        hm.put("jda", "Semen");

        Map<String, String> duplicates = new HashMap<>();
        List<String> keys = new ArrayList<>();

        for (Map.Entry<String, String> entry : hm.entrySet()) {
            if (duplicates.containsKey(entry.getValue())) {
                keys.add(entry.getKey());
                String val = duplicates.get(entry.getValue());
                if (!keys.contains(val)) {
                    keys.add(val);
                }
            } else {
                duplicates.put(entry.getValue(), entry.getKey());
            }
        }

        for (String key : keys) {
            hm.remove(key);
        }
        System.out.println(hm);

    }
}
...
Рейтинг: 0 / 0
17.02.2013, 00:39
    #38154309
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
благодарю откликнувшихся, попробую адаптировать
...
Рейтинг: 0 / 0
17.02.2013, 02:53
    #38154388
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
покрутил чуть, теперь работает
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public static void removeTheFirstNameDuplicates(HashMap<String, String> map)
    {
    	ArrayList<String> keyList=new ArrayList<String>();
    	for(int i=0; i<15; i++){
        	int count=0;
    		String currentName; String currentKey = null;
    		String tempName=""; Boolean chek = false;
	        for (Map.Entry<String, String> pair: map.entrySet())
	        {
	        	currentKey=pair.getKey();
	        	if(!keyList.isEmpty()) {
	        		if(keyList.contains(currentKey)) continue;
	        		chek=false;
	        	}
	        	currentName=pair.getValue();
	        	if (!chek) { tempName=currentName; chek = true; }
	        	if (currentName.equals(tempName) & chek) count++;
	        }
	        if (count==0) break; 
	        else if (count==1) keyList.add(currentKey); 
	        else { removeItemFromMapByValue(map, tempName); }
        }
    }
...
Рейтинг: 0 / 0
17.02.2013, 03:14
    #38154397
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
Olega жалко
...
Рейтинг: 0 / 0
17.02.2013, 03:55
    #38154407
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
rema174,
а с чего вы взяли, что дубликаты у вас будут идти по порядку друг за другом?
...
Рейтинг: 0 / 0
17.02.2013, 12:39
    #38154503
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
javapecker,
Всмысле не будет работать, если они хаотично перемешаны? Работает и в хаотичном порядке.
...
Рейтинг: 0 / 0
17.02.2013, 14:29
    #38154585
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
rema174,
а так?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
        hm.put("qwe", "Igor");
        hm.put("qweasd", "Igor");
        hm.put("sd1", "Oleg");
        hm.put("asd", "Petr");
        hm.put("zxc", "Petr");
        hm.put("qwwe", "Igor");
        hm.put("fda", "Semen");
        hm.put("hda", "Semen");
        hm.put("jda", "Semen");
        hm.put("asdf", "Petro");
        hm.put("asdfd", "Костя");
        hm.put("gda", "Semen");
        hm.put("вмвм", "4343");
...
Рейтинг: 0 / 0
17.02.2013, 15:56
    #38154650
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
javapecker,
...
Рейтинг: 0 / 0
17.02.2013, 16:46
    #38154676
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HashMap - повторы значений
rema174,

странно, вот собрал в кучу все ваше:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
public class Test {

    public static void main(String[] args) {
        HashMap<String, String> hm = new HashMap<>();

        hm.put("qwe", "Igor");
        hm.put("qweasd", "Igor");
        hm.put("sd1", "Oleg");
        hm.put("asd", "Petr");
        hm.put("zxc", "Petr");
        hm.put("qwwe", "Igor");
        hm.put("fda", "Semen");
        hm.put("hda", "Semen");
        hm.put("jda", "Semen");
        hm.put("asdf", "Petro");
        hm.put("asdfd", "Костя");
        hm.put("gda", "Semen");
        hm.put("вмвм", "4343");

        removeTheFirstNameDuplicates(hm);
        System.out.println(hm);
    }

    public static void removeTheFirstNameDuplicates(HashMap<String, String> map) {
        ArrayList<String> keyList = new ArrayList<String>();
        for (int i = 0; i < 15; i++) {
            int count = 0;
            String currentName;
            String currentKey = null;
            String tempName = "";
            Boolean chek = false;
            for (Map.Entry<String, String> pair : map.entrySet()) {
                currentKey = pair.getKey();
                if (!keyList.isEmpty()) {
                    if (keyList.contains(currentKey)) {
                        continue;
                    }
                    chek = false;
                }
                currentName = pair.getValue();
                if (!chek) {
                    tempName = currentName;
                    chek = true;
                }
                if (currentName.equals(tempName) & chek) {
                    count++;
                }
            }
            if (count == 0) {
                break;
            } else if (count == 1) {
                keyList.add(currentKey);
            } else {
                removeItemFromMapByValue(map, tempName);
            }
        }
    }

    public static void removeItemFromMapByValue(HashMap<String, String> map, String value) {
        HashMap<String, String> copy = new HashMap<String, String>(map);
        for (Map.Entry<String, String> pair : copy.entrySet()) {
            if (pair.getValue().equals(value)) {
                map.remove(pair.getKey());
            }
        }
    }
}


получаю на выходе
{sd1=Oleg}
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / HashMap - повторы значений / 25 сообщений из 45, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]