나는 이것이 오래된 스레드라는 것을 알고 있지만 다른 대답은 내 유스 케이스를 완전히 해결하지 못했습니다 (구아바 멀티 세트가 똑같이 할 수도 있지만 여기에는 예가 없습니다). 내 서식을 변명 해주세요. 나는 여전히 스택 교환에 게시하는 것에 익숙하지 않습니다. 또한 오류가 있으면 알려주세요
당신이 말할 수 있습니다 List<T>
A와 List<T>
B를하고 그들이 다음과 같은 조건과 동일한 경우 확인하려면 :
1) O (n) 예상 실행 시간
2) 평등은 다음과 같이 정의됩니다. a 또는 b의 모든 요소에 대해 a에서 요소가 발생하는 횟수는 b에서 요소가 발생하는 횟수와 같습니다. 요소 평등은 T.equals ()로 정의됩니다
private boolean listsAreEquivelent(List<? extends Object> a, List<? extends Object> b) {
if(a==null) {
if(b==null) {
//Here 2 null lists are equivelent. You may want to change this.
return true;
} else {
return false;
}
}
if(b==null) {
return false;
}
Map<Object, Integer> tempMap = new HashMap<>();
for(Object element : a) {
Integer currentCount = tempMap.get(element);
if(currentCount == null) {
tempMap.put(element, 1);
} else {
tempMap.put(element, currentCount+1);
}
}
for(Object element : b) {
Integer currentCount = tempMap.get(element);
if(currentCount == null) {
return false;
} else {
tempMap.put(element, currentCount-1);
}
}
for(Integer count : tempMap.values()) {
if(count != 0) {
return false;
}
}
return true;
}
우리가 해시 맵에 O (2 * n) 삽입을하고 O (3 * n) 해시 맵 선택을 수행하기 때문에 실행 시간은 O (n)입니다. 이 코드를 완전히 테스트하지 않았으므로주의하십시오 :)
//Returns true:
listsAreEquivelent(Arrays.asList("A","A","B"),Arrays.asList("B","A","A"));
listsAreEquivelent(null,null);
//Returns false:
listsAreEquivelent(Arrays.asList("A","A","B"),Arrays.asList("B","A","B"));
listsAreEquivelent(Arrays.asList("A","A","B"),Arrays.asList("A","B"));
listsAreEquivelent(Arrays.asList("A","A","B"),null);