Programing

자바에서 양방향지도를 만드는 방법

crosscheck 2021. 1. 7. 19:42
반응형

자바에서 양방향지도를 만드는 방법


1 : 1 관계로 string-int 값 쌍을 저장하는 데이터 구조가 필요하며 어느 쪽에서도 대응할 수 있습니다.

Hashtable 및 String 배열로 클래스를 작성하고 데이터를 두 번 저장하고 조회를 위해 내장 함수를 사용했습니다.

내 질문은 이것을 달성하는 더 좋은 방법이 있습니까? 그리고 더 좋게 말하면 효율적이고 데이터를 두 번 저장하지 않고 바람직하게는 많은 코드를 작성하지 않고 : P를 의미합니다.


bimap을 찾고있는 것 같습니다.

Google 컬렉션 (현재 Guava 의 일부 )에는 BiMap몇 가지 구현 이있는 인터페이스가 포함되어 있습니다 .

로부터 BiMap문서 :

바이 맵 (또는 "양방향 맵")은 값과 키의 고유성을 유지하는 맵입니다. 이 제약 조건을 통해 Bimap은이 Bimap과 동일한 항목을 포함하지만 키와 값이 반전 된 또 다른 Bimap 인 "역보기"를 지원할 수 있습니다.

BiMap.inverse메서드 Map는 값을 키로, 키를 값으로 반환하는 것처럼 보이 므로 값 Map을 호출 get하고 키를 검색하는 데 사용할 수 있습니다 .

또한에서 Map반환하는 inverse것은 기본 데이터의보기이므로 원본 데이터의 추가 복사본을 만들 필요가 없습니다.

로부터 BiMap.inverse방법 문서 :

이 Bimap의 각 값을 연관된 키에 매핑하는이 Bimap의 역 뷰를 반환합니다. 두 개의 Bimap은 동일한 데이터로 뒷받침됩니다. 하나에 대한 모든 변경 사항은 다른 하나에 나타납니다.


이와 같은 간단한 구현을 할 수 있습니다. 이 구현에서는 데이터가 복사되지 않습니다. 참조 만! 추가 및 가져 오기에 대한 구현을 추가했습니다. 제거 및 기타 필요한 방법은 운동으로 남겨 둡니다. :)

public class TwoWayHashmap<K extends Object, V extends Object> {

  private Map<K,V> forward = new Hashtable<K, V>();
  private Map<V,K> backward = new Hashtable<V, K>();

  public synchronized void add(K key, V value) {
    forward.put(key, value);
    backward.put(value, key);
  }

  public synchronized V getForward(K key) {
    return forward.get(key);
  }

  public synchronized K getBackward(V key) {
    return backward.get(key);
  }
}

그리고 당연히 '가치'조차도 뒤 따르는 애플리케이션 책임은 독특합니다. 사용 예 :

TwoWayHashmap twmap = new TwoWayHashmap<String, String>();
twmap.add("aaa", "bbb");
twmap.add("xxx", "yyy");
System.out.println(twmap.getForward("xxx"));
System.out.println(twmap.getBackward("bbb"));

Apache Commons에는 BidiMap (Bi Directional Map) 도 포함되어 있습니다.

키와 값 사이의 양방향 조회를 허용하는 맵을 정의합니다.

이 확장 맵은 키가 값을 조회 할 수 있고 값이 키를 동등하게 쉽게 조회 할 수있는 매핑을 나타냅니다. 이 인터페이스는지도를 확장하므로지도가 필요한 모든 곳에서 사용할 수 있습니다. 인터페이스는 역지도보기를 제공하여 BidiMap의 양방향에 대한 전체 액세스를 가능하게합니다.


Google Guava 에는 원하는 작업 을 수행 하는 BiMap 이 있습니다.


Guava 사용 ,

    HashBiMap<String, String> map = HashBiMap.create();

    map.put("name", "Sohail");
    map.put("country", "Pakistan");

    Log.d("tag", "name is " + map.get("name"));


    BiMap<String, String>invmap= map.inverse();

    Log.d("tag", "Pakistan is a " + invmap.get("Pakistan"));

여기에서 전체 자습서를 읽으 십시오.


Object를 Object에 매핑하는 해시 맵을 만듭니다. 그런 다음 동일한 맵을 사용하여 String-> Integer 및 Integer-> String을 저장할 수 있습니다.

string / int 쌍을 추가 할 때 동일한 맵에 양방향으로 추가하면됩니다.

참조 URL : https://stackoverflow.com/questions/3430170/how-to-create-a-2-way-map-in-java

반응형