仅当参数对象是调用对象的子集时,此函数才应返回 true,但它始终返回 true。如何解决?

    public boolean contains(FileCollection other) { 
        int i = 0; 
        int j = 0; 
        for (i = 0; i<other.files.length; i++) { 
            for (j = 0; j<this.files.length; j++) { 
                if ((other.files[i]).equals((this.files[j]))) //this refers to the equals method defined in File class 
                    break; 
            } 
            if (j==this.files.length)  
                return false; 
        } 
        return true;//this method is in FileCollection class 
    } 

请您参考如下方法:

(由于您没有明确表达数组元素的数据类型,我假设它是 File,从注释中推断。)

如果您不介意在数据结构之间进行转换,也许将数组(临时)转换为集合是最简单的方法。例如,转换为 List:

/* @param other 
 * @return true if the calling object contains 
 * all files in the parameter object, false otherwise 
 */ 
public boolean contains(FileCollection other) { 
    List<File> myList = Arrays.asList(this.files); 
    List<File> otherList = Arrays.asList(other.files); 
    return myList.containsAll(otherList); 
} 

根据您对允许重复项时什么被视为“包含”的澄清,我认为您需要计算每个元素的存在数量。方法如下:

根据@Eritrean 的回答,您可以获取计数并将其存储到 map 中。我也进行了修改以检查计数:

public boolean contains(FileCollection other) { 
    Map<File,Integer> otherFrequency = Arrays.stream(other.files) 
            .collect(Collectors.toMap(Function.identity(), v->1,Integer::sum)); 
 
    Map<File,Integer> thisFrequency  = Arrays.stream(this.files)  
            .collect(Collectors.toMap(Function.identity(), v->1,Integer::sum)); 
 
    if (thisFrequency.entrySet().containsAll(otherFrequency).entrySet()) { 
        for (File entry : otherFrequency.entrySet()) { 
            if (thisFrequency.get(entry) < otherFrequency.get(entry)) 
                return false; 
        } 
        return true; 
    } 
    return false; 
} 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!