如何查找重复的行并在其前面显示重复次数

时间:2018-08-31 18:31:57

标签: java collections

是的,这是一个琐碎的问题,但是我没有找到重复的问题。目前,来自此集合(ArrayList):

{
  channel: "Xamper",
  unSubscribers: 1
}

我必须明白这一点:(也就是说,每个单词的重复数是遇到的重复次数)

Java
C#
Java
Python

此刻我正在使用Map,但是它会删除重复项,这就是我得到的。

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);

在使用List的实现中,我有一个问题,即将当前元素增加1,但同时又创建了另一个。

伙计们,任何会指导我解决问题的想法或线索都将令我满意!

UPD:这个问题的所有答案都是神圣的。感谢大伙们!在不冒犯他人的情况下,尝试选择正确的答案感到很尴尬。

6 个答案:

答案 0 :(得分:3)

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()));

}

答案 1 :(得分:3)

您可以在迭代列表时使用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

答案 2 :(得分:2)

我会这样做。首先,您将列表中每个项目的出现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));
}

答案 3 :(得分:1)

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));

}

答案 4 :(得分:1)

您可以执行第二次迭代,并查找与每个条目关联的计数。

以下内容创建了一个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)]

答案 5 :(得分: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);
        }
    }
array.foreach(item -> System.out.println(item + " -> " + map.get(item))