2017-04-02 1 views
0

TreeMap 형식을 사용하여 컬렉션을 정의했습니다 < 문자열, 목록 < 쌍 < 정수, 문자열 >>> 어떤 쌍이 클래스인지 내가 정의하는 것이 :<String, List <Pair <Integer, String >>>

public class Pair<L,R> { 
    private L l; 
    private R r; 
    public Pair(L l, R r) { 
     this.l = l; 
     this.r = r; 
    } 
public L getL() {return l;} 
public R getR() {return r;} 
public void setL(L l){this.l = l;} 
public void setR(R r){this.r = r;} 

} 

나는 주어진 문자열 값을 포함하는리스트와 결합되는 문자열 (트리 맵 키)를 반환합니다. 예를 들어, 목록에있는 쌍 중 하나에 저장된 "밥"이라는 문자열이 있는데 "밥"이 들어있는 쌍의 목록과 관련된 트리 맵의 키 (문자열)를 반환하려고합니다. 이 일을 어떻게 하죠?

+0

은 역 매핑을 유지하는 또 다른지도를 만들고, 함께 둘을 유지한다. 유일한 다른 방법은 (entrySet()을 사용하여) 맵의 모든 엔트리를 반복하고 각리스트에서 값을 검색하는 것입니다. – ajb

+0

코드를 작성하는 데 문제가 있습니다 ... –

+0

키가 여러 개있을 수 있으므로 내 함수가 콜렉션 < String>을 반환합니다. 응용 프로그램의 다른 부분에서 키를 사용하여 목록을 조회해야합니다. , 키에 의해 사전 순으로리스트를 반복한다. 그렇지 않으면이 데이터 구조는 필요한 것과 완전히 반대입니다. –

답변

0

이것은 본질적으로 역방향 조회입니다. 값에 연결된 키가 map이고 연관된 값이 어떤 조건을 충족시키는 키를 찾고 싶습니다. 최악의 경우이 경우 테이블 전체가 이 될 것입니다. 매우 비쌀 수 있습니다. 결국지도의 모든 항목에 액세스 할 수 있기 때문입니다.

처음에는 다음과 같이 매우 간단합니다. 나는 Pair 클래스를 조금 수정하는 자유를 가졌다. 다음의 인쇄 요구 사항에 따라 키 key2 :

public class ReverseLookup { 
    static class Pair<L,R> { 
     private L l; 
     private R r; 
     public Pair(L l, R r) { 
      this.l = l; 
      this.r = r; 
     } 
     public L getL() {return l;} 
     public R getR() {return r;} 
     public void setL(L l){this.l = l;} 
     public void setR(R r){this.r = r;} 

     public static <L, R> Pair<L, R> right(List<Pair<L, R>> pairs, R rVal) { 
      for (Pair<L, R> pair : pairs) { 
       if (rVal != null && rVal.equals(pair.getR())) 
        return pair; 
      } 
      return null; 
     } 
    } 

    public static void main(String[] args) { 
     String lookFor = "bob"; 
     Map<String, List<Pair <Integer, String>>> listOfPairs = new TreeMap<>(); 
     listOfPairs.put(
      "key1", Arrays.asList(new Pair("2", "carol"), new Pair(4, "david")) 
      ); 
     listOfPairs.put(
     "key2", Arrays.asList(new Pair("0", "alice"), new Pair(1, "bob")) 
     ); 
     for (Map.Entry<String, List<Pair<Integer, String>>> entry : listOfPairs.entrySet()) { 
      // entry is a mapping from string -> list of pairs Integer, String 
      List<Pair<Integer, String>> pairs = entry.getValue(); 
      if (Pair.right(pairs, lookFor) != null) { 
       System.out.println(entry.getKey()); 
      } 
     } 
    } 
} 
0

나는 내부에서 작업하면서 술어를 만들 것입니다. 당신이 그 논리를 따를 수 있기를 바랍니다. 이렇게하면 "Bob"이있는 첫 번째 목록을 찾아 해당 키를 가져옵니다.

Predicate<Pair<Integer, String>> pairHasBobPred = pair -> ((String) pair.getR()).equals("Bob"); 

Predicate<String> keyHasBobPred = key -> myTree.get(key).stream() 
                .anyMatch(pairHasBobPred::test); 

String keyWithBob = myTree.keySet().stream() 
            .filter(keyHasBobPred::test) 
            .findFirst() 
            .get(); 
관련 문제