在链表中查找不同元素的数量

时间:2012-03-31 22:44:34

标签: java

我有一个包含许多对象的LinkedList。如何在LinkedList中找到不同元素的数量和频率。

5 个答案:

答案 0 :(得分:3)

您可以使用for-each loop迭代列表,同时保持histogram

直方图实际上是Map<T,Integer>,其中T是链表中元素的类型。

如果您使用HashMap,则会获得O(n)平均案例算法 - 请确保为T覆盖equals()hashCode()元素。 [如果T是内置类[例如IntegerString],您不应该担心这一点,他们已经覆盖了这些方法]。

这个想法很简单:为每个元素迭代数组:在直方图中搜索它 - 如果它不存在,则插入值为1 [因为你刚刚第一次看到它]。如果它已经在直方图中,请提取value,然后重新插入元素 - 使用相同的密钥和value + 1

应如下所示:[list类型为LinkedList<Integer>]

Map<Integer,Integer> histogram = new HashMap<Integer, Integer>();
for (Integer x : list) {
    Integer value = histogram.get(x);
    if (value == null) histogram.put(x,1);
    else histogram.put(x, value + 1);
}

答案 1 :(得分:2)

直方图解决方案与Guava Multiset

的更简单变体
Multiset<Integer> multiset = HashMultiset.create();
multiset.addAll(linkedList);

int count = multiset.count(element); // number of occurrences of element
Set<Integer> distinctElements = multiset.elementSet();
  // set of all the unique elements seen

(披露:我在番石榴上工作。)

答案 2 :(得分:1)

@ amit的答案很好,但我想分享一点点变化(并且不能在评论中格式化代码块 - 否则这只是一个评论)。我想制作两个通道,一个用于创建直方图元素,第二个用于填充它们。这对我来说感觉更干净,虽然可能效率较低。

Map<Integer,Integer> histogram = new HashMap<Integer, Integer>();
for (Integer n : list)
    histogram.put(n, 0);
for (Integer n : list)
    histogram.put(n, histogram.get(n) + 1);

答案 3 :(得分:1)

LambdaJ Library提供了一些有趣的方法来查询集合:

List<Jedi> jedis = asList(
        new Jedi("Luke"),  new Jedi("Obi-wan"), new Jedi("Luke"), 
        new Jedi("Yoda"), new Jedi("Mace-Windu"),new Jedi("Luke"), 
        new Jedi("Obi-wan")
        );

Group<Jedi> byName = with(jedis).group(Groups.by(on(Jedi.class).getName()));
System.out.println(byName.find("Luke").size()); //output 3
System.out.println(byName.find("Obi-wan").size()); //ouput 2

答案 4 :(得分:0)

我刚刚了解了HashSet。我还不知道地图。所以让我建议我的解决方案基于HashSet。

for(String a:Linklist1){
              if(Hashset1.add(a){
                                 count++;
                                }
                       }
System.out.println(count);

希望这会有所帮助。