2012-03-23 43 views
0

由于数组中的等号函数只检查实例,所以对于Set来说效果不佳。 因此,我不知道如何在java中创建一组数组?如何在java中创建一组数组?

一种可能的方式可以将每个数组放在一个对象中,并为该类实现equals函数,但会降低性能吗?

+0

对于一组实现了基于哈希表,你也需要实现'hashCode'。对于基于树的集合实现,您需要实现某种排序。 – 2012-03-23 15:29:26

+0

与[如何使'Map'使用数组作为键]密切相关(http://stackoverflow.com/questions/16839182/can-a-java-array-be-used-as-a-hashmap-key) 。 – Raedwald 2015-02-26 13:05:32

回答

-1

由于ArrayList类已包装的阵列,则可以延长它并覆盖equalshashCode方法。下面是一个示例:

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; 
    } 
} 
2

不要使用原始数组,除非你绝对必须因为一些需要数组的遗留API。

总是尝试和使用类型安全ArrayList<T>而不是你会有这些类型的问题。

+0

+1为最佳实践。 – 2012-03-23 15:49:52

-2

扩展Set和重写equals方法的类可以做到这一点。

1

如果你使你的Set成为TreeSet的一个实例,你可以指定一个用于所有比较(甚至相等)的自定义比较器。

0

您可以为您的数组创建包装类并覆盖哈希码并相应地等于。 例如:

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