Java 在ArrayList中查找使用最多和最少的字符串
我很难在ArrayList中找到使用最多和最少的字符串。程序应该遍历一个字符串文件,并计算列表中有多少个字符串。然后打印列表中使用最少和最多的名称。ArrayList部分已完成。这只是找到我遇到麻烦的最常见和最不常见的名字。我甚至不知道如何开始。这是我在网上发现的,但它不起作用Java 在ArrayList中查找使用最多和最少的字符串,java,arraylist,Java,Arraylist,我很难在ArrayList中找到使用最多和最少的字符串。程序应该遍历一个字符串文件,并计算列表中有多少个字符串。然后打印列表中使用最少和最多的名称。ArrayList部分已完成。这只是找到我遇到麻烦的最常见和最不常见的名字。我甚至不知道如何开始。这是我在网上发现的,但它不起作用 Map<String, Integer> dogNames = new HashMap<>(); for (Dog dog : dogs) { Integer value = dogNam
Map<String, Integer> dogNames = new HashMap<>();
for (Dog dog : dogs) {
Integer value = dogNames.get(dog);
if (value == null) {
value = 0;
}
value++;
dogNames.put(dog.getName(), value);
}
int leastCommon = Integer.MAX_VALUE;
String leastCommonName = null;
for (String name : dogNames.keySet()) {
int value = dogNames.get(name);
if (value < leastCommon) {
leastCommon = value;
leastCommonName = name;
}
}
System.out.println("Least common (" + leastCommon + ") is " + leastCommonName);
Map dogNames=newhashmap();
用于(狗:狗){
整数值=dogNames.get(dog);
如果(值==null){
数值=0;
}
值++;
dogNames.put(dog.getName(),value);
}
int leastCommon=Integer.MAX_值;
字符串leastCommonName=null;
for(字符串名称:dogNames.keySet()){
int value=dogNames.get(name);
如果(值<最小公共值){
leastCommon=值;
leastCommonName=名称;
}
}
System.out.println(“最不常见(“+leastCommon+”)是“+leastCommonName”);
您的代码应该如下所示
Map<String,int> frequencyOfDogNames = new HashMap<String,int>();
for(String dogName:dogNames) {
if(frequencyOfDogNames.contains(dogName)) {
continue;
}
frequencyOfDogNames.put(dogName, Collections.frequency(dogs, "dogName"));
}
Map frequencyOfDogNames=new HashMap();
for(字符串dogName:dogNames){
if(频率dognames.contains(dogName)){
继续;
}
频率dognames.put(dogName,Collections.frequency(dogs,dogName));
}
这将为您提供所有出现的名称的映射
现在我们应该循环思考地图,看看哪一个是最大值和最小值
int leastCommon = Integer.MAX_VALUE;
int mostCommon = 0;
String leastCommonName, mostCommonName;
int occurrence;
for(String dogName: frequencyOfDogNames.keySet()) {
occurrence = frequencyOfDogNames.get(dogName);
if(leastCommon > occurrence){
leastCommon = occurrence;
leastCommonName = dogName;
}
if(mostCommon < occurrence){
mostCommon = occurrence;
mostCommonName = dogName;
}
}
int-leastCommon=Integer.MAX\u值;
int mostCommon=0;
字符串leastCommonName,mostCommonName;
int发生;
for(字符串dogName:frequencyOfDogNames.keySet()){
事件=dognames.get(dogName)的频率;
如果(最小公共值>发生次数){
leastCommon=发生次数;
leastCommonName=狗名;
}
如果(最常见<发生){
最常见=发生;
mostCommonName=狗名;
}
}
您的代码似乎存在以下问题:
Integer value = dogNames.get(dog);
你的地图上有狗的名字(String
),但是你得到的是不存在的狗的条目!因此,value
保持为0
,即使您以前见过该名称。如果您解决了这个问题,您的代码应该可以工作
您还可以根据地图中的计数定义自定义的比较器
,然后使用Collections.min
和Collections.max
,而不是搜索最不常用的名称:
Comparator<Dog> comp = new Comparator<Dog>() {
@Override
public int compare(Dog o1, Dog o2) {
return Integer.compare(dogNames.get(o1.getName()), dogNames.get(o2.getName()));
}
};
System.out.println("least " + Collections.min(dogs, comp));
System.out.println("most " + Collections.max(dogs, comp));
甚至更短,使用Collections.frequency
而不是构建自己的地图,并使用它进行比较。但是,请注意,如果列表很长,这将是浪费,因为这将每次重新搜索列表,而不是在映射中缓存计数
List<Dog> dogs = ...
Comparator<Dog> comp = Comparator.comparing(d -> Collections.frequency(dogs, d.getName()));
System.out.println("least " + Collections.min(dogs, comp));
System.out.println("most " + Collections.max(dogs, comp));
列出狗=。。。
Comparator comp=Comparator.comparing(d->Collections.frequency(dogs,d.getName());
System.out.println(“最小值”+集合.min(狗,comp));
System.out.println(“most”+Collections.max(dogs,comp));
您也可以查看此信息
List<Dog> dogs = ...
Comparator<Dog> comp = Comparator.comparing(d -> Collections.frequency(dogs, d.getName()));
System.out.println("least " + Collections.min(dogs, comp));
System.out.println("most " + Collections.max(dogs, comp));