powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / HashMap - повторы значений
25 сообщений из 45, страница 1 из 2
HashMap - повторы значений
    #38154256
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно убрать все повторяющиеся записи, и вроде все работает.
Проблема в том, что если в записи с ("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
HashMap - повторы значений
    #38154262
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174,

а по какому принципу определить, какого из них убрать?
Код: java
1.
2.
3.
4.
        hm.put("fda", "Semen");
    	hm.put("gda", "Semen");
    	hm.put("hda", "Semen");
    	hm.put("jda", "Semen");
...
Рейтинг: 0 / 0
HashMap - повторы значений
    #38154266
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
HashMap - повторы значений
    #38154271
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapecker,

+1

rema174,

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

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




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

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

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

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

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


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

Или все же 13937484 ?

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

это задача такая, условие не я придумал :-) кроме того, последний метод уже был задан
...
Рейтинг: 0 / 0
HashMap - повторы значений
    #38154294
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javapecker, ваше решение мне понятно, спасибо, но условие было другое
...
Рейтинг: 0 / 0
HashMap - повторы значений
    #38154297
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
HashMap - повторы значений
    #38154300
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
HashMap - повторы значений
    #38154309
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
благодарю откликнувшихся, попробую адаптировать
...
Рейтинг: 0 / 0
HashMap - повторы значений
    #38154388
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.
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
HashMap - повторы значений
    #38154397
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Olega жалко
...
Рейтинг: 0 / 0
HashMap - повторы значений
    #38154407
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174,
а с чего вы взяли, что дубликаты у вас будут идти по порядку друг за другом?
...
Рейтинг: 0 / 0
HashMap - повторы значений
    #38154503
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javapecker,
Всмысле не будет работать, если они хаотично перемешаны? Работает и в хаотичном порядке.
...
Рейтинг: 0 / 0
HashMap - повторы значений
    #38154585
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
HashMap - повторы значений
    #38154650
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javapecker,
...
Рейтинг: 0 / 0
HashMap - повторы значений
    #38154676
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
25 сообщений из 45, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / HashMap - повторы значений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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