由于数组中的等号函数只检查实例,所以对于Set来说效果不佳。 因此,我不知道如何在java中创建一组数组?如何在java中创建一组数组?
一种可能的方式可以将每个数组放在一个对象中,并为该类实现equals函数,但会降低性能吗?
由于数组中的等号函数只检查实例,所以对于Set来说效果不佳。 因此,我不知道如何在java中创建一组数组?如何在java中创建一组数组?
一种可能的方式可以将每个数组放在一个对象中,并为该类实现equals函数,但会降低性能吗?
由于ArrayList类已包装的阵列,则可以延长它并覆盖equals
和hashCode
方法。下面是一个示例:
public MyArrayList extends ArrayList<MyClass> {
@Override
public boolean equals(Object o) {
if (o instanceof MyArrayList) {
//place your comparison logic here
return true;
}
return false;
}
@Override
public int hashCode() {
//just a sample, you can place your own code
return super.hashCode();
}
}
UPDATE:
你甚至可以覆盖它的一般用法,只是改变了代码:
public MyArrayList<T> extends ArrayList<T> {
//overrides the methods you need
@Override
public boolean equals(Object o) {
if (o instanceof MyArrayList) {
//place your comparison logic here
return true;
}
return false;
}
}
不要使用原始数组,除非你绝对必须因为一些需要数组的遗留API。
总是尝试和使用类型安全ArrayList<T>
而不是你会有这些类型的问题。
+1为最佳实践。 – 2012-03-23 15:49:52
扩展Set和重写equals方法的类可以做到这一点。
如果你使你的Set成为TreeSet的一个实例,你可以指定一个用于所有比较(甚至相等)的自定义比较器。
您可以为您的数组创建包装类并覆盖哈希码并相应地等于。 例如:
public class MyArrayContainer {
int[] myArray = new int[100];
@Override
public boolean equals(Object other) {
if (null!= other && other instanceof MyArrayContainer){
MyArrayContainer o = (MyArrayContainer) other;
final int myLength = myArray.length;
if (o.myArray.length != myLength){
return false;
}
for (int i = 0; i < myLength; i++){
if (myArray[i] != o.myArray[i]){
return false;
}
}
return true;
}
return false;
}
@Override
public int hashCode() {
return myArray.length;
}
}
对于一组实现了基于哈希表,你也需要实现'hashCode'。对于基于树的集合实现,您需要实现某种排序。 – 2012-03-23 15:29:26
与[如何使'Map'使用数组作为键]密切相关(http://stackoverflow.com/questions/16839182/can-a-java-array-be-used-as-a-hashmap-key) 。 – Raedwald 2015-02-26 13:05:32