使用Map<String, Integer>和输入顺序查找数组列表中的重复项

4
大家好,我正在尝试打印所有重复的元素,这个方法很好用,但输出结果不是按顺序排列的(无论是用户输入还是文本文件)。 我想要按顺序打印所有元素(不打印重复项)。我该怎么做? 代码来自Find the duplicate elements in arraylist and display,感谢@Cory Kendall提供的代码。
更新问题:现在代码使用LinkedHashMap已经完美运行。现在我想要按数字标记(即1. name1 = 2)递增地打印输出结果。谢谢。
List<String> strings = new ArrayList<String>();
// suppose datas are entered by user incrementally or from a text files.

Map<String, Integer> counts = new HashMap<String, Integer>();

for (String str : strings) {
    if (counts.containsKey(str)) {
        counts.put(str, counts.get(str) + 1);
    } else {
        counts.put(str, 1);
    }
}

for (Map.Entry<String, Integer> entry : counts.entrySet()) {
    System.out.println(entry.getKey() + " = " + entry.getValue());
}

1
你说的是1. 打印出所有重复的元素 和 2. 打印出所有有顺序的元素(不包括重复的)。你真正想要哪一个? - Marko Topolnik
抱歉造成困惑,我想按顺序打印所有元素。谢谢。 - Casper
4个回答

6

如果您想记住Map中的插入顺序,您需要使用LinkedHashMap。在您的情况下,您需要替换

Map<String, Integer> counts = new HashMap<String, Integer>();

使用

Map<String, Integer> counts = new LinkedHashMap<String, Integer>();

已完成,但现在我想用数字标志递增地显示该列表,如何使用上述代码实现。谢谢。 - Casper
@user1986597:在循环外初始化一个 int,并在每次循环中递增它。 - jlordo

3

HashMap不是有序或排序的,如果您关心插入顺序,请使用LinkedHashMap,如果您关心自然顺序,请使用TreeMap


2
public class FindDup {
    public static void main(String[] args) {
        String str[] = { "yogi", "ram", "ram", "yogi", "yogi", "yogi", "raju", "raju", "ram", "yogi", };
        Map<String, Integer> map = new HashMap<String, Integer>();
        for (String s : str) {
            if (map.containsKey(s)) {
                map.put(s, map.get(s) + 1);
            } else {
                map.put(s, 1);
            }
        }
        for (Entry<String, Integer> e : map.entrySet()) {
            System.out.println(e.getKey() + "---" + e.getValue());

        }
    }
}

1

LinkedHashMap可以保留顺序。

Map<String, Integer> counts = new LinkedHashMap<String, Integer>();

关于 LinkedHashMap
实现了 Map 接口的哈希表和链表,具有可预测的迭代顺序。这个实现与 HashMap 不同之处在于它维护了一个双向链表,遍历所有条目。这个链表定义了迭代顺序,通常是键插入到映射中的顺序(插入顺序)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接