我正在尝试弄清楚如何计算ArrayList
中由破折号---
分解的元素的出现。
ArrayList<String> animals = new ArrayList<String>();
animals.add("dog");
animals.add("cat");
animals.add("bat");
animals.add("bat");
animals.add("---");
animals.add("cat");
animals.add("dog");
animals.add("dog");
animals.add("---");
animals.add("bat");
animals.add("bat");
animals.add("dog");
所以我的ArrayList
看起来像这样:
animals = {"dog", "cat", "bat", "bat", "---", "cat", "dog", "dog", "---", "bat", "bat", "dog"}
我希望我的输出按字母顺序显示如下:
bat: 2
cat: 1
dog: 1
---
cat: 1
dog: 2
---
bat: 2
dog: 1
在我破折号之前,我就是通过使用这个
int occurrences = Collections.frequency(animals, "bat");
有什么想法可以实现吗?
答案 0 :(得分:3)
主要取决于您打算如何使用每个值的频率。如果仅是打印目的,请执行以下操作:
SortedMap<String, Integer> freq = new TreeMap<>(); // to sort keys alphabetically
for (String animal : animals) {
if (animal.equals("---")) {
System.out.println(freq);
freq.clear();
} else {
freq.merge(animal, 1, Integer::sum);
}
}
System.out.println(freq);
将输出:
{bat=2, cat=1, dog=1}
{cat=1, dog=2}
{bat=2, dog=1}
答案 1 :(得分:0)
如果您使用的是Java8,则可以构造出真正令人恐惧的东西,为每个子列表提取索引范围,并将对每个范围内的元素的引用收集到单独的列表中:
int[] indexes =
Stream.of(IntStream.of(-1), IntStream.range(0, animals.size())
.filter(i -> animals.get(i).equals("---")), IntStream.of(animals.size()))
.flatMapToInt(s -> s).toArray();
List<List<String>> subSets =
IntStream.range(0, indexes.length - 1)
.mapToObj(i -> animals.subList(indexes[i] + 1, indexes[i + 1]))
.collect(Collectors.toList());
for (List l : subSets) {
int uiBats = Collections.frequency(l, "bat");
...
或像普通人一样遍历列表:
for(String value : animals){
LinkedList<String> temp = new LinkedList<String>();
if(value.equals("---")) {
values.add(temp);
temp = new LinkedList<String>();
}else{
temp.add(value);
}
}
for(LinkedList<String> list : values){
System.out.println("Frequency in " + list + " is " + Collections.frequency(list, "bat"));
}
答案 2 :(得分:0)
我建议使用番石榴中的Multiset
:
final Multiset<String> multiset = TreeMultiset.create();
for (final String animal : animals)
{
if (!animal.equals("---"))
{
multiset.add(animal);
} else
{
print(multiset);
multiset.clear();
}
}
print(multiset);
}
private static void print(final Multiset<String> multiset)
{
multiset.entrySet().forEach(v -> System.out.println(v.getElement() + " = " + v.getCount()));
System.out.println("---");
}
结果:
bat = 2
cat = 1
dog = 1
---
cat = 1
dog = 2
---
bat = 2
dog = 1
---
答案 3 :(得分:-4)
如果要使用Collections.frequency(..),则可以创建一个
List<List<String>> values = new LinkedList<LinkedList<String>>();
然后遍历动物列表并添加到值列表中
for(String value : animals){
LinkedList<String> temp = new LinkedList<String>();
if(value.equals("---")) {
values.add(temp);
temp = new LinkedList<String>();
}else{
temp.add(value);
}
}
for(LinkedList<String> list : values){
System.out.println("Frequency in " + list + " is " + Collections.frequency(list, "bat"));
}
我没有IDE可以测试它,但是应该可以:)
祝你好运!