Jestem nowy w javie. Szukałem tego problemu w SO, ale próbowałem na swój własny sposób. Mam mapę i drukuje następujące:

Key = MX Week Email Pulls 010521 -010621_22780_1, Value = 010521010621
Key = MX Week Email Pulls 010721 -010921_23122, Value = 010721010921
Key = MX Week Email Pulls 010321 -010421_22779, Value = 010321010421
Key = MX Week Email Pulls 010521 -010621_22780, Value = 010521010621

Ponieważ klucz jest inny, chcę znaleźć duplikaty tych kluczy za pomocą wartości. Ponieważ zduplikowana wartość powyżej to:

010521010621
010521010621

Próbowałem znaleźć duplikat, zwiększając wartość licznika:

public void doAnalysis(Map<String,String> mapAll) {
        List<String> listOf=new ArrayList<>();
        Map<String,Integer> putDupli=new HashMap<String, Integer>();
    for (Map.Entry<String,String> entry : mapAll.entrySet()) {
          System.out.println("Key = " + entry.getKey() +
                  ", Value = " + entry.getValue());
           if(!putDupli.containsValue(entry.getValue())) {
               putDupli.put(entry.getValue(),0);
           }
           else {
               putDupli.put(entry.getValue(),putDupli.get(entry.getKey())+1); 
           }
        }
    
    System.out.println(putDupli);
        
    }

Wiersz System.out.println(putDupli); jest drukowany

{010521010621=0, 010721010921=0, 010321010421=0}

Moją oczekiwaną produkcją było:

 {010521010621=2, 010721010921=0, 010321010421=0}
0
Ashwin Karki 21 czerwiec 2021, 16:59

4 odpowiedzi

Najlepsza odpowiedź

Powinno być if(!putDupli.containsKey(entry.getValue())) {

Zamiast

if(!putDupli.containsValue(entry.getValue())) {

Ponieważ druga mapa umieszcza wartość jako klucz.

Również putDupli.put(entry.getValue(),putDupli.get(entry.getKey())+1);

Powinien być

putDupli.put(entry.getValue(), putDupli.get(entry.getValue()) + 1);.

Co więcej, prawdopodobnie chcesz, aby początkowa liczba wynosiła 1 zamiast 0.

Jeśli wyłapanie tych błędów jest na początku trudne, spróbuj użyć debugera.

2
M A 21 czerwiec 2021, 14:09

Jeśli używasz javy 8, możesz użyć Stream, aby uzyskać liczbę

Map<String, Long> dupliMap = mapAll.values().stream()
    .collect(Collectors.groupingBy(
        x -> x,
        Collectors.counting()
));
0
Praveen 21 czerwiec 2021, 14:10

Spróbuj tego:

!putDupli.containsValue(entry.getValue().toString)

Jako twoje porównywanie wartości Integer do String.

0
coco-candy 21 czerwiec 2021, 14:12

Możesz rozważyć inne podejście. Utwórz Map<Integer,List<Long>>, aby przechowywać wartości w następujący sposób:

String[] data = { "010521,010521010621",
        "010721,010721010921", "010321,010321010421",
        "010521,010521010621" };
Map<Integer, List<Long>> map =
        Arrays.stream(data).map(str -> str.split(","))
                .collect(Collectors.groupingBy(
                        arr -> Integer.valueOf(arr[0]),
                        Collectors.mapping(
                                arr -> Long.valueOf(arr[1]),
                                Collectors.toList())));

Następnie możesz znaleźć liczbę każdej wartości.

for (List<Long> list : map.values()) {
    System.out.println(list.get(0) + "=" + list.size());
}

Wydruki

10321010421=1
10721010921=1
10521010621=2
0
WJS 21 czerwiec 2021, 15:30