[java] Map을 구현하고 삽입 순서를 유지하는 Java 클래스?

키 값 연결이 있지만 해시를 사용하지 않는 Java 클래스를 찾고 있습니다. 내가 현재하고있는 일은 다음과 같습니다.

  1. 에 값 추가 Hashtable .
  2. 에 대한 반복자를 가져옵니다 Hashtable.entrySet() .
  3. 모든 값을 반복하고 다음을 수행하십시오.
    1. 도착 Map.Entry이터레이터를 .
    2. 유형의 객체 생성 Module값을 기준으로 (사용자 정의 클래스)를 .
    3. 클래스를 JPanel에 추가하십시오.
  4. 패널을 표시하십시오.

이것의 문제는 값을 다시 얻는 순서를 제어 할 수 없으므로 주어진 순서로 값을 표시 할 수 없다는 것입니다 (주문 하드 코딩없이).

나는 사용하는 것 ArrayList또는 Vector이것에 대한,하지만 나중에 코드에서 나는 잡을 필요가 Module내가 함께 할 수없는 주어진 키에 대한 객체를 ArrayList하거나 Vector.

누구 든지이 작업을 수행 할 무료 / 오픈 소스 Java 클래스 또는 값을 얻는 방법을 알고 있습니까? Hashtable 추가 된 시점을 기준으로 있습니까?

감사!



답변

나는 LinkedHashMap또는을 제안한다 TreeMap. A LinkedHashMap는 삽입 된 순서대로 키를 유지하고 a TreeMap는 요소 Comparator의 자연 Comparable순서 또는 정렬을 통해 정렬됩니다 .

요소를 정렬 된 상태로 유지할 필요가 없으므로 LinkedHashMap대부분의 경우 더 빠릅니다. TreeMap보유 O(log n)성능 containsKey, get, put, 및 remove, JavaDoc을 따라,이 동안 LinkedHashMap이다O(1) 마다.

특정 정렬 순서와 반대로 만, 예측 가능한 정렬 순서를 예상하여 API는, 인터페이스를 사용하는 것을 고려하면이 두 클래스는 구현, NavigableMap또는 SortedMap. 이를 통해 특정 구현을 API로 유출하지 않고 해당 특정 클래스 중 하나 또는 나중에 완전히 다른 구현으로 전환 할 수 있습니다.


답변

LinkedHashMap은지도의 keySet (), entrySet () 또는 values ​​()를 반복 할 때지도에 삽입 된 순서대로 요소를 반환합니다.

Map<String, String> map = new LinkedHashMap<String, String>();

map.put("id", "1");
map.put("name", "rohan");
map.put("age", "26");

for (Map.Entry<String, String> entry : map.entrySet()) {
    System.out.println(entry.getKey() + " = " + entry.getValue());
}

그러면 맵에 배치 된 순서대로 요소가 인쇄됩니다.

id = 1
name = rohan
age = 26 


답변

불변의 맵이 귀하의 요구에 맞는 경우 구글에 의해 구아바 라는 도서관이 있습니다 ( 구아바 질문 참조 )

Guava 는 신뢰할 수있는 사용자 지정 반복 순서와 함께 ImmutableMap 을 제공합니다 . 이 ImmutableMap 은 containsKey에 대해 O (1) 성능을 갖습니다. 분명히 넣고 제거는 지원되지 않습니다.

ImmutableMap 객체는 우아한 정적 편의 메서드 of ()copyOf () 또는 Builder 객체 를 사용하여 구성됩니다 .


답변

Map(빠른 조회 List를 위해) 및 (순서를 위해) 유지할 수 있지만 a LinkedHashMap가 가장 간단 할 수 있습니다. 또한 시도 할 수 있습니다 SortedMap예를 들어 TreeMap사용자가 지정한 임의의 순서를 가지고있는.


답변

오픈 소스인지는 모르겠지만 약간의 인터넷 검색 결과 ArrayList 사용 하여이 Map 구현을 발견 했습니다 . 1.5 이전의 Java 인 것 같으므로 일반화 할 수 있습니다. 이 구현에는 O (N) 액세스 권한이 있지만 JPanel에 수백 개의 위젯을 추가하지 않아도 문제가되지 않습니다.


답변

링크 트리 맵 구현을 시도 할 수 있습니다.


답변

미리 알려진 것의 자연스러운 순서를 유지해야 할 때마다 EnumMap을 사용합니다.

키는 열거 형이며 원하는 순서로 삽입 할 수 있지만 반복 할 때 열거 형 순서 (자연 순서)로 반복됩니다.

또한 EnumMap을 사용할 때 더 효율적인 충돌이 없어야합니다.

enumMap을 사용하면 코드를 깨끗하게 읽을 수 있습니다. 여기에 예가 있습니다