我无法在String
中找到最常用且使用最少的ArrayList
。该程序应该通过一个字符串文件,并计算列表中有多少个字符串。然后在列表中打印最少和最常用的名称。 ArrayList
部分已完成。它只是找到了我遇到麻烦的最常见和最不常见的名字。我不知道如何开始它。我试过询问,但是我以HashMap
的形式得到了它。我有点想弄明白,但这是我能想到的。
for (int i = 0; i< dogs.size(); i++)
if dogs.get(0).getName().equals dogs.get(i).getName();
{
dogs.get(i).getName()++;
}
答案 0 :(得分:2)
您可以先对列表进行排序,然后计算相同连续名称的数量。然后只保留最小和最大的数字..
ofcource hashmaps是这类问题的理想选择,除非你有一个很好的理由不能使用它,否则你应该使用hashmap这个
答案 1 :(得分:0)
您可以使用frequency()
例如:
List<String> myList=new ArrayList<>();
myList.add("a");
myList.add("b");
myList.add("a");
for(String i:new HashSet<>(myList)){
System.out.println(i+" has "+Collections.frequency(myList,i)+" times ");
}
Out put:
b has 1 times
a has 2 times
您可以应用它来查找最多和最低的事件。
或者您可以使用HashMap
。
List<String> myList = new ArrayList<>();
myList.add("a");
myList.add("b");
myList.add("a");
Map<String, Integer> map = new HashMap<>();
for (String i : new HashSet<>(myList)) {
Integer val = map.get(i);
if (val != null) {
map.put(i, val + 1);
} else {
map.put(i, 1);
}
}
您将获得所有String
答案 2 :(得分:0)
这是依靠Java Streams API解决问题的方法:
final SortedSet<Entry<String, Long>> s =
lineList.stream().collect(groupingBy(identity(), counting())).entrySet()
.stream().collect(toCollection(()->new TreeSet<>(comparing(Entry::getValue))));
System.out.println(s.first() + ", " + s.last());
或者,如果您可以从读取文件的位置重新开始,这会更好,因为它会跳过您首先创建行列表并直接构建频率映射的步骤:
try (BufferedReader r = Files.newBufferedReader(Paths.get("input.txt"))) {
final SortedSet<Entry<String, Long>> s =
r.lines().collect(groupingBy(identity(), counting())).entrySet().stream()
.collect(toCollection(()->new TreeSet<>(comparing(Entry::getValue))));
System.out.println(s.first() + ", " + s.last());
}
注意:这是上述代码所需的静态导入列表:
import static java.util.Comparator.comparing;
import static java.util.function.Function.identity;
import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toCollection;