Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在ArrayList中查找使用最多和最少的字符串_Java_Arraylist - Fatal编程技术网

Java 在ArrayList中查找使用最多和最少的字符串

Java 在ArrayList中查找使用最多和最少的字符串,java,arraylist,Java,Arraylist,我很难在ArrayList中找到使用最多和最少的字符串。程序应该遍历一个字符串文件,并计算列表中有多少个字符串。然后打印列表中使用最少和最多的名称。ArrayList部分已完成。这只是找到我遇到麻烦的最常见和最不常见的名字。我甚至不知道如何开始。这是我在网上发现的,但它不起作用 Map<String, Integer> dogNames = new HashMap<>(); for (Dog dog : dogs) { Integer value = dogNam

我很难在ArrayList中找到使用最多和最少的字符串。程序应该遍历一个字符串文件,并计算列表中有多少个字符串。然后打印列表中使用最少和最多的名称。ArrayList部分已完成。这只是找到我遇到麻烦的最常见和最不常见的名字。我甚至不知道如何开始。这是我在网上发现的,但它不起作用

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));