Java Collections API로 작업하는 동안이 문제점이 발생했습니다. 기본적으로 이것은 MST를 찾는 Kruskal의 알고리즘 구현을위한 지원 방법입니다. union/find 알고리즘을 구현하기 위해이 클래스를 만들었습니다.Java Collections API HashSet 제거 방법
제 질문은 작업을 찾을 수 있었기 때문에 "union"메서드의 remove 메서드가 일관되게 작동하지 않는 이유에 대해 알 수 있습니다. 그것은 런타임에 일부 요소를 제거하고 다른 요소는 제거하지 않습니다. 예를 들어, 도시와 관련된 작업에 이것을 구현했는데 일부 도시를 제거하는 것이 싫은 것처럼 보였습니다. 특히 그것은 두 세트의 다른 세트를 반복적으로 우연히 발견했지만 항상 동일한 세트를 발견했습니다. 나는 이것이 객체 참조 문제인지 여부, 즉 내가 잘못된 것을 테스트하고 있는지의 여부를 궁금해했다. 그러나 나는 그 문제를 해결할 수 없었다.
저는 요소를 제거한 루프로 대체 할 수 있었고 알고리즘이 완벽하게 실행되었으므로 나머지 작업이 정확하다는 것을 알고 있습니다. 아마 약간 더 나쁜 성능으로.
누구든지 실수를 볼 수 있는지 궁금합니다. 또한 나는 다른 클래스에서 호출했음을 주목해야한다. 그러나 호출은 find 메소드를 사용하여 검색된 요소로 이루어진다. remove 메소드를 변경하는 것만으로 모든 것이 작동하도록 find 메소드가 제대로 작동해야합니다. 즉, 적절한 객체를 찾고 반환하는 것이기 때문에 잘 작동해야합니다.
감사
오스카
/*
* A constructor for creating a new object of this class.
*/
DisjointSets()
{
underlying = new HashSet<HashSet<String>>();
}
/*
* A method for adding a set to this DisjointSets object
*/
void add(HashSet<String> h)
{
underlying.add(h);
}
/*
* A method for finding an element in this DisjointSet object.
*/
HashSet<String> find(String s)
{
// Check each set in the DisjointSets object
for(HashSet<String> h: underlying)
{
if(h.contains(s))
{
return h;
}
}
return null;
}
/*
* A method for combining to subsets of the DisjointSets
*/
void union(HashSet<String> h1, HashSet<String> h2)
{
System.out.print("CHECK ON DS\n");
System.out.print("*********************\n");
System.out.print("H1 is : { ");
for (HashSet<String> n: underlying)
{
System.out.print("Set is : { ");
for (String h : n)
{
System.out.print(h + " , ");
}
System.out.print("} \n ");
}
// Add the objects of h1 to h2
// DOES NOT WORK CONSISTENTLY
h1.addAll(h2);
underlying.remove(h2);
}
}
내가
HashSet<HashSet<String>> temp = new HashSet<HashSet<String>>();
for(HashSet<String> f: underlying)
{
if(f != h2)
{
temp.add(f);
}
}
underlying = temp;
@ lwburk 서식 도움말에 감사드립니다. – oscarcollings