Как найти повторяющиеся строки и отобразить количество повторений перед ними - PullRequest
0 голосов
/ 31 августа 2018

Да, тривиальный вопрос, но я не нашел дубликат. На данный момент из этой коллекции (ArrayList):

Java
C#
Java
Python

Я должен получить это: (то есть над каждым словом будет находиться количество найденных дубликатов)

Java 2
C# 1
Java 2
Python 1

В данный момент я использую карту, но она удаляет дубликаты, и вот что я получаю.

Java 2
C# 1
Python 1

Вот мой код:

      Map<String, Integer> map = new HashMap<>();
        for (String temp : array) {
            Integer count = map.get(temp);
            if (count != null){
                map.put(temp, count + 1);
            }
            else {
                map.put(temp, 1);
            }
        }

У меня была идея записать данные в другой список, чтобы просмотреть этот список, сравнивая каждый элемент «родительского» списка со всеми элементами нового списка. Примерно так:

List<String> resultList = new ArrayList<>();
List<String> mainList = new ArrayList<>();

    for (int i = 0; i < arrayList.size(); i++) {
        mainList.add(i,arrayList.get(i));
    }

    for (int i = 0; i < mainList.size(); i++) {
            int x = 1;
        for (String anArray : arrayList) {
            if (mainList.get(i).equals(anArray)) {
                resultList.add(i,mainList.get(i) + " "+ x++);
            }
        }
    }
    resultList.forEach(System.out::println);

, который работает так, как мне нужно, но также создает дополнительную строку при обнаружении дубликата.

Java 2
C# 1
Java 2
Python 1
Java 1
Java 1

В реализации со списком у меня есть проблема в том, что он увеличивает текущий элемент на 1, но одновременно создает и другой элемент.

Ребята, я буду рад любой идее или подсказке, которая поможет мне решить мою проблему!

UPD: Все ответы на этот вопрос божественны. Спасибо вам, ребята! Мне неловко пытаться выбрать правильный ответ, не оскорбляя других.

Ответы [ 6 ]

0 голосов
/ 31 августа 2018

Вы можете просто выполнить итерацию по «массиву» еще раз и запросить карту хеша для частоты.

Map<String, Integer> map = new HashMap<>();
    for (String temp : array) {
        Integer count = map.get(temp);
        if (count != null){
            map.put(temp, count + 1);
        }
        else {
            map.put(temp, 1);
        }
    }
array.foreach(item -> System.out.println(item + " -> " + map.get(item))
0 голосов
/ 31 августа 2018

Вы можете использовать Collections.frequency при итерации списка, чтобы напечатать количество вхождений каждого слова в списке:

public static void main(String[] args) {
    List<String> list = Arrays.asList("Java", "C#", "Java", "Python");
    list.forEach( s -> System.out.println(s + " " + Collections.frequency(list, s)));
}

Выход:

Java 2
C# 1
Java 2
Python 1
0 голосов
/ 31 августа 2018
public static void main(String[] args) {

    List<String> list = Arrays.asList("Java", "C#", "Java", "Python");

    list.forEach( s -> System.out.println(s + " " + list.stream().filter( s::equals ).count()));

}
0 голосов
/ 31 августа 2018

Я бы сделал это таким образом. Сначала вы собираете Map<String, Long> вхождения каждого из элементов в вашем списке. После этого вы просто перебираете свой исходный список, распечатываете элемент вместе с его счетом на полученной карте.

Вот пример:

List<String> list  = new ArrayList<>();
list.add("Java");
list.add("CORE");
list.add("Java");
list.add("Java");


Map<String, Long> stringLongMap = list.stream() // collectors (java 8)
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));



for(String item: list) { // I just printed the result, you can do whatever you want
    System.out.println(item + " " + stringLongMap.get(item));
}
0 голосов
/ 31 августа 2018

Вы можете выполнить вторую итерацию и посмотреть количество, связанное с каждой записью.

Следующее создает pair, связывающее оригинальные ключи с их соответствующим количеством:

List<String> list = Arrays.asList("Java", "C#", "Java", "Python");

Map<String, Long> counts = list.stream()
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

//You could replace `Pair` with any other suitable type, 
//such as java.util.AbstractMap.SimpleEntry<String, Long>

List<Pair<String, Long>> pairs = list.stream().map(str -> Pair.of(str, counts.get(str)))
        .collect(Collectors.toList());

Результат (pairs): [(Java,2), (C#,1), (Java,2), (Python,1)]

0 голосов
/ 31 августа 2018
List<String> arrayList = Arrays.asList("JAVA", "C", "JAVA", "PYTHON");

Map<String, Integer> map = new HashMap<>();
for (String s : arrayList) {
    // computeIfAbsent checks if the key already exists in the map:
    //  -- if it exists, it just returns the value for that key.
    //     else the second param (Function) is applied to get the value.
    Integer count = map.computeIfAbsent(s, key -> 0); // If key is absent, 0 will be set as value for this key. If present, value associated with this key is returned.
    map.put(s, count + 1); // increment and set.
}

for (String s : arrayList){
    System.out.println(s +" -> " + map.get(s));

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...