打印Collection.Max的输出

时间:2014-02-07 11:47:52

标签: java collections

我有以下代码。 Collections.Max返回。如何通过System.out.println()显示字符串和整数的值?

public class SortMapOnKeyExample {

    public static void main(String[] args) {
        List<String> list=new ArrayList<String>();
        list.add("sultan");
        list.add("Masum");
        list.add("sultan");
        list.add("Sorry");
        list.add("sultan");
        list.add("Masum");
        list.add("sultan");
        list.add("Tarek");
        list.add("sultan");

        Set<String> uniques = new HashSet(list);
        Map<String, Integer> counts = new HashMap<String, Integer>();

        for (String elem : uniques)
        {
            counts.put(elem, Collections.frequency(list, elem));
        }

        Collections.max(counts.entrySet(), new Comparator<Entry<String, Integer>>() {
            @Override
            public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
                return (o1.getValue() - o2.getValue());
            }
        });

    }

}

我已经尝试了很多但是无法知道我该怎么做?请帮助我。此代码的目的是查找最大值发生的字符串及其索引?

1 个答案:

答案 0 :(得分:1)

首先,您的代码将在O(n^2)时间内运行 - 每次调用Collections.frequency都必须遍历整个数据,并且每个元素都会执行一次。您可以轻松制作此O(n)

final Map<String, Integer> counts = new HashMap<>();
for (final String s : list) {
    final Integer c = counts.get(s);
    if (c == null) {
        counts.put(s, 1);
    } else {
        counts.put(s, c + 1);
    }
}

现在请注意,您可以拥有多个具有相同计数的项目。您需要按值排序条目,然后打印顶部的条目:

final List<Entry<String, Integer>> entries = new ArrayList<>(counts.entrySet());
Collections.sort(entries, new Comparator<Entry<String, Integer>>() {

    @Override
    public int compare(final Entry<String, Integer> o1, final Entry<String, Integer> o2) {
        return Integer.compare(o2.getValue(), o1.getValue());
    }
});
final MessageFormat format = new MessageFormat("{0} has a count of {1,number,integer}");
final Iterator<Entry<String, Integer>> iter = entries.iterator();
final Entry<String, Integer> first = iter.next();
System.out.println(format.format(new Object[]{first.getKey(), first.getValue()}));
while (iter.hasNext()) {
    final Entry<String, Integer> entry = iter.next();
    if (entry.getValue() != first.getValue()) {
        break;
    }
    System.out.println(format.format(new Object[]{entry.getKey(), entry.getValue()}));
}

首先,我们从List的{​​{1}}创建entrySet()。接下来我们对Map进行排序 - 注意比较的逆序 - 这意味着排序是降序而不是升序。另请注意使用List,这是因为使用Integer.compare进行比较是非常糟糕的做法,因为如果a - b很大且a很大且为负,它会溢出;虽然不是问题,但这并不是一个好习惯。

现在我们将b作为Iterator并继续打印元素,直到我们遇到一个不等于(必须小于)第一个元素计数的元素。

输出:

List

对于不同的数据,我们添加{sultan=5, Sorry=1, Tarek=1, Masum=2} sultan has a count of 5 五次,输出也变为:

Test