我有一个包含许多对象的LinkedList。如何在LinkedList中找到不同元素的数量和频率。
答案 0 :(得分:3)
您可以使用for-each loop迭代列表,同时保持histogram。
直方图实际上是Map<T,Integer>
,其中T
是链表中元素的类型。
如果您使用HashMap,则会获得O(n)
平均案例算法 - 请确保为T
覆盖equals()
和hashCode()
元素。 [如果T
是内置类[例如Integer
或String
],您不应该担心这一点,他们已经覆盖了这些方法]。
这个想法很简单:为每个元素迭代数组:在直方图中搜索它 - 如果它不存在,则插入值为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)
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);
希望这会有所帮助。