이것은 본질적으로 역방향 조회입니다. 값에 연결된 키가 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());
}
}
}
}
은 역 매핑을 유지하는 또 다른지도를 만들고, 함께 둘을 유지한다. 유일한 다른 방법은 (entrySet()을 사용하여) 맵의 모든 엔트리를 반복하고 각리스트에서 값을 검색하는 것입니다. – ajb
코드를 작성하는 데 문제가 있습니다 ... –
키가 여러 개있을 수 있으므로 내 함수가 콜렉션 < String>을 반환합니다. 응용 프로그램의 다른 부분에서 키를 사용하여 목록을 조회해야합니다. , 키에 의해 사전 순으로리스트를 반복한다. 그렇지 않으면이 데이터 구조는 필요한 것과 완전히 반대입니다. –