2013-06-11 5 views
1

String name; 변수를 사용하려면 equalshashCode을 재정의 한 Java Set<MyClass>이 있습니다.하나의 클래스에서 집합을 사용하지만 문자열로 찾으십시오.

public class MyClass{ 
    final String name; 
    public boolean equals(Object o){...} 
    public int hashCode(){return name.hashCode();} 
} 

내가

MyClass o = set.get("nameofmyobject"); 

자바에서이 작업을 수행 할 수있는 방법이나 자료 구조가 있습니까

같은 것을 사용하여 HashSet의에서 나의 객체를 얻을 수 어쨌든 있나요? 또는지도 세트를 모두 변경해야합니까?

답변

2

this q를 살펴보십시오. uestion. 내 대답은 아니오 야. Set은 요소를 가져 오는 것이 아니라 평등을 찾는 것입니다. Map 또는 List insteed를 사용하십시오.

+0

리스트는'O (n)'액세스를 제공합니다. 세트를 반복하면됩니다. – tom

+0

나는 그 질문에 대한 링크를 좋아한다. 나는 그것을 보지 못했다. 비록 그 질문조차도 실제로 왜 설명하지 않습니다 : ( –

+0

당신이 Object를 가지고있는 Set을 찾으면, 당신은 Object를 이미 가지고있을 것입니다. 그렇지 않으면 당신은 그것을 찾을 수 없을 것입니다. 그래서 동일성 검사 후에 Object로 작업하지 마십시오. ? –

3

아니요. Map으로 변경해야합니다. Set의 메소드 중 어느 것도 요소를 리턴하지 않습니다.

부록
당신이 속도를 신경 쓰지 않으면 당신은 항상 수동으로 검색 할 수 있습니다

MyClass find(String name, Set<MyClass> set) 
{ 
    MyClass wrapper = new MyClass(name); 
    for (MyClass e : set) { 
     if (wrapper.equals(e)) { 
      return e; 
     } 
    } 
    return null; 
} 

부록 B를
당신이 사용하는 경우 TreeSet 당신이 사용할 수있는 floor :

MyClass find(String name, TreeSet<MyClass> set) 
{ 
    MyClass wrapper = new MyClass(name); 
    MyClass candidate = set.floor(wrapper); 
    if (candidate != null && wrapper.equals(candidate)) { 
     return candidate; 
    } else { 
     return null; 
    } 
} 
+0

나는 세트를 사용하고, 지금은지도로 이동해야합니다 이유 속도에 대한 관리 작업을 수행. 나는 (나에게 보이는 것) 중복 키를 저장하기 위해'O (n) '에 의해 공간 요구량을 늘리는 것에 만족하지 않는다. –

+0

@JaySmith 더 이상의 공간을 사용하지 않을 것이다. 자바의'HashSet'은'HashMap'을 사용하여 구현됩니다. [JDK7 소스] (http://hg.openjdk.java.net/jdk7/2d/jdk/file/8f19b165347b/src/share/classes/java/util/HashSet.java)를 참조하십시오. – tom

+0

톰 링크에 감사드립니다. 결코 알지 못했습니다. –

1

Tim이 말했듯이 당신은 할 수 없습니다. 그리고 그렇다면 set.get (myClassInstance)와 같이 호출해야합니다. 및 (저장된 인스턴스의 일부 회원) set.get하지

사용

Map<String, MyClass> myMap = new HashMap<String, MyClass>(); 
관련 문제