仅当参数对象是调用对象的子集时,此函数才应返回 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;
}