배열의 equals 함수는 인스턴스 만 검사하기 때문에 Set과 함께 작동하지 않습니다. 따라서 Java에서 배열 집합을 만드는 방법을 궁금합니다.자바에서 배열의 집합을 만드는 방법?
가능한 한 가지 방법은 각 배열을 객체에 넣을 수 있고 해당 클래스에 대해 equals 함수를 구현할 수 있지만 성능이 너무 떨어지게할까요?
배열의 equals 함수는 인스턴스 만 검사하기 때문에 Set과 함께 작동하지 않습니다. 따라서 Java에서 배열 집합을 만드는 방법을 궁금합니다.자바에서 배열의 집합을 만드는 방법?
가능한 한 가지 방법은 각 배열을 객체에 넣을 수 있고 해당 클래스에 대해 equals 함수를 구현할 수 있지만 성능이 너무 떨어지게할까요?
, 당신은 그것을 확장하고 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입니다. –
Set를 확장하고 equals 메소드를 대체하는 클래스가이를 수행 할 수있는 클래스.
Set를 TreeSet의 인스턴스로 만들면 모든 비교 (동등성)에 사용될 사용자 지정 Comparator를 지정할 수 있습니다.
배열에 대한 래퍼 클래스를 만들고 그에 따라 해시 코드와 같음을 재정의 할 수 있습니다. 예를 들어 : ArrayList에 클래스가 이미 배열을 래핑 때문에
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'도 구현해야합니다. 트리를 기반으로 설정된 구현의 경우 일종의 순서를 구현해야합니다. –
[Map이 키를 배열로 사용하는 방법]과 밀접한 관련이 있습니다. (http://stackoverflow.com/questions/16839182/can-a-java-array-be-used-as-a-hashmap-key) . 우수 사례는 – Raedwald