【发布时间】:2021-03-05 06:23:11
【问题描述】:
我编写了一个代码来查找唯一的图像。如果两个图像具有相同的名称(即使扩展名不同)并且大小相等(宽度 * 长度),则它们是相等的。 但它未能找到独特的图像。 即使重写了 equals 方法,HashSet 方法也无法识别两个相似的对象。
import java.util.*;
class UniqueImages {
public static class Image {
private String filename;
private int width;
private int height;
public Image(String filename, int width, int height) {
this.filename = filename;
this.width = width;
this.height = height;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((filename == null) ? 0 : filename.hashCode());
result = prime * result + height;
result = prime * result + width;
return result;
}
/**
* Two Images are considered equal if they have
* the same filename (without the extension), and the
* same number of pixels.
* Thus, flag.jpg with width=60 height=40 is
* equal to flag.gif with width=40 and height=60
*/
public boolean equals(Object other) {
Image o = (Image)other;
if (filename == null || o.filename == null)
return false;
String[] components = filename.split("\\.");
String[] ocomponents = o.filename.split("\\.");
return components[0].equals(ocomponents[0]) &&
width * height == o.width * o.height;
}
public String toString() {
return "Image: filename=" + filename + " Size=" + width*height;
}
}
public static void printImages(Set<Image> images) {
for(Image image: images) {
System.out.println(image);
}
}
public static void main(String[] args) {
Image[] images = {new Image("flag.jpg", 40, 60),
new Image("flag.gif", 40, 60),
new Image("smile.gif", 100, 200),
new Image("smile.gif", 50, 400),
new Image("other.jpg", 40, 60),
new Image("lenna.jpg", 512, 512),
new Image("Lenna.jpg", 512, 512)};
Set<Image> set = new HashSet<Image>(Arrays.asList(images));
UniqueImages.printImages(set);
}
}
【问题讨论】:
-
您可能希望名称比较不区分大小写。此外,是否应该将 50x400 图像视为与 100x200 图像相同?对我来说没有意义。
-
两者的总大小是一样的,所以我认为它是一样的。
-
你的 hashCode() 和 equals() 不一致。您应该使 hashCode 遵循与 equals 相同的规则,这意味着忽略文件扩展名。
-
你可以让你的IDE为你生成
equals和hashCode。
标签: java collections set equals hashset