Programing

지도를 구현하고 삽입 순서를 유지하는 Java 클래스?

c10106 2022. 5. 22. 11:06
반응형

지도를 구현하고 삽입 순서를 유지하는 Java 클래스?

나는 키-값 연관성이 있지만 해시를 사용하지 않는 자바에서 수업을 찾고 있다.내가 현재 하고 있는 일은 다음과 같다.

  1. 에 값 추가Hashtable.
  2. 다음 작업을 위한 반복기를 가져오십시오.Hashtable.entrySet().
  3. 모든 값을 반복하고 다음을 수행하십시오.
    1. 받다Map.Entry반복자를 위해
    2. 유형의 개체 만들기Module(사용자 정의 클래스).
    3. JPanel에 클래스를 추가하십시오.
  4. 패널을 표시하십시오.

이에 대한 문제는 값을 다시 받는 순서에 대한 통제가 없기 때문에 (순서를 하드 코딩하지 않고) 주어진 순서에 값을 표시할 수 없다는 것이다.

I would would us a an. 난...ArrayList또는Vector이걸 위해, 하지만 나중에 코드에서, 나는 그것을 잡아야 한다.Module내가 할 수 없는, 주어진 키에 대해 이의를 제기하다.ArrayList또는Vector.

이것을 할 자유/오픈 소스 Java 클래스나, 혹은 가치를 얻는 방법에 대해 아는 사람이 있는가?Hashtable언제 추가됐는지 알 수 있을까?

고마워!

A 또는 A를 추천한다….LinkedHashMap키가 삽입된 순서대로 유지되는 동안TreeMapA를 통해 분류된다.Comparator또는 자연 그대로의Comparable원소의 순서

원소를 정리할 필요가 없기 때문에,LinkedHashMap대부분의 경우 더 빨라야 한다.TreeMap가지다O(log n)을 위한 공연.containsKey,get,put그리고remove자바도크 족에 따르면, 한편LinkedHashMap이다O(1)각각에 대해

만약 당신의 API, 오직 예측 가능한 정렬 순서 기대 심리로 특정 정렬 순서와는 달리 이 두개의 클래스, NavigableMap 또는 SortedMap을 구현하는 인터페이스를 사용하는 것이 좋다.이것은 당신의 API로 뒤에 구체적인 수업이나 완전히 다른 구현 그 후의로 전환 특정한 구현을 유출하지 않도록 할 것이다.

LinkedHashMap은 맵의 keySet(), entrySet() 또는 값()을 반복할 때 맵에 삽입된 순서대로 요소를 반환한다.

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라는 도서관이 있다(guava 질문 참조).

Guava는 신뢰할 수 있는 사용자 지정 반복 순서와 함께 ImableMap을 제공한다.불변성 맵은 includsKey, get에 대한 O(1) 성능을 가지고 있다.확실히 put and remove는 지원되지 않는다.

ImableMap 객체는()copyOf()의 우아한 정적 편의 방법 또는 Builder 객체를 사용하여 구성된다.

A을(를) 유지할 수 있다.Map(빠른 조회를 위해) 및List(주문용) 그러나 aLinkedHashMap가장 간단한 것일 수도 있다.다음 작업을 수행해 보십시오.SortedMap예)TreeMap지정한 순서가 있는 명령어입니다.

LinkedHashMap을 지도에서 기본 삽입 순서에 사용할 수 있음

Java LinkedHashMap 클래스에 대한 중요한 점은 다음과 같다.

  1. 그것은 오직 독특한 요소만을 포함하고 있다.

  2. LinkedHashMap에는 키에 기반한 값이 포함되어 있다.

  3. 하나의 null 키와 여러 null 값을 가질 수 있다.

  4. 대신 삽입 순서를 유지하는 HashMap과 동일함

    public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> 
    

그러나 사용자 정의 개체 또는 원시 데이터 유형 키를 사용하여 지도에서 값을 정렬하려면 TreeMap을 사용하십시오. 자세한 내용은 이 링크를 참조하십시오.

삽입 순서를 유지하는 사용자 지정 맵을 사용하거나 구현할 수 있다.

다음 기능을 사용하여 다음을 사용할 수 있다.

  • 내부적으로 LinkedHashMap을 사용하여 삽입 순서를 유지한다.
  • 키 포함null또는 빈 문자열은 허용되지 않는다.
  • 일단 가치가 있는 키가 만들어지면, 우리는 그것의 가치를 무시하지 않을 것이다.

HashMap vsLinkedHashMapCustomHashMap

interface CustomMap<K, V> extends Map<K, V> {
    public boolean insertionRule(K key, V value);
}

@SuppressWarnings({ "rawtypes", "unchecked" })
public class CustomHashMap<K, V> implements CustomMap<K, V> {
    private Map<K, V> entryMap;
    // SET: Adds the specified element to this set if it is not already present.
    private Set<K> entrySet;

    public CustomHashMap() {
        super();
        entryMap = new LinkedHashMap<K, V>();
        entrySet = new HashSet();
    }

    @Override
    public boolean insertionRule(K key, V value) {
        // KEY as null and EMPTY String is not allowed.
        if (key == null || (key instanceof String && ((String) key).trim().equals("") ) ) {
            return false;
        }

        // If key already available then, we are not overriding its value.
        if (entrySet.contains(key)) { // Then override its value, but we are not allowing
            return false;
        } else { // Add the entry
            entrySet.add(key);
            entryMap.put(key, value);
            return true;
        }
    }
    public V put(K key, V value) {
        V oldValue = entryMap.get(key);
        insertionRule(key, value);
        return oldValue;
    }
    public void putAll(Map<? extends K, ? extends V> t) {
        for (Iterator i = t.keySet().iterator(); i.hasNext();) {
            K key = (K) i.next();
            insertionRule(key, t.get(key));
        }
    }

    public void clear() {
        entryMap.clear();
        entrySet.clear();
    }
    public boolean containsKey(Object key) {
        return entryMap.containsKey(key);
    }
    public boolean containsValue(Object value) {
        return entryMap.containsValue(value);
    }
    public Set entrySet() {
        return entryMap.entrySet();
    }
    public boolean equals(Object o) {
        return entryMap.equals(o);
    }
    public V get(Object key) {
        return entryMap.get(key);
    }
    public int hashCode() {
        return entryMap.hashCode();
    }
    public boolean isEmpty() {
        return entryMap.isEmpty();
    }
    public Set keySet() {
        return entrySet;
    }
    public V remove(Object key) {
        entrySet.remove(key);
        return entryMap.remove(key);
    }
    public int size() {
        return entryMap.size();
    }
    public Collection values() {
        return entryMap.values();
    }
}

의 사용법CustomHashMap:

public static void main(String[] args) {
    System.out.println("== LinkedHashMap ==");
    Map<Object, String> map2 = new LinkedHashMap<Object, String>();
    addData(map2);

    System.out.println("== CustomHashMap ==");
    Map<Object, String> map = new CustomHashMap<Object, String>();
    addData(map);
}
public static void addData(Map<Object, String> map) {
    map.put(null, "1");
    map.put("name", "Yash");
    map.put("1", "1 - Str");
    map.put("1", "2 - Str"); // Overriding value
    map.put("", "1"); // Empty String
    map.put(" ", "1"); // Empty String
    map.put(1, "Int");
    map.put(null, "2"); // Null

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

O/P:

== LinkedHashMap == | == CustomHashMap ==
null = 2            | name = Yash
name = Yash         | 1 = 1 - Str
1 = 2 - Str         | 1 = Int
 = 1                |
  = 1               |
1 = Int             |

KEY가 고정되어 있는 것을 알고 있다면 EnumMap을 사용할 수 있다.속성/X에서 값 가져오기ML 파일

EX:

enum ORACLE {
    IP, URL, USER_NAME, PASSWORD, DB_Name;
}

EnumMap<ORACLE, String> props = new EnumMap<ORACLE, String>(ORACLE.class);
props.put(ORACLE.IP, "127.0.0.1");
props.put(ORACLE.URL, "...");
props.put(ORACLE.USER_NAME, "Scott");
props.put(ORACLE.PASSWORD, "Tiget");
props.put(ORACLE.DB_Name, "MyDB");

오픈소스인지는 모르겠지만, 조금 구글을 검색한 결과, ArrayList를 이용한 맵의 이 구현을 발견했다.1.5 Java 이전 버전인 것 같으니 일반화를 원할 수도 있는데, 쉬워야 한다.이 구현에는 O(N) 액세스 권한이 있지만 JPanel에 수백 개의 위젯을 추가하지 않으면 문제가 되지 않는다는 점에 유의하십시오.

미리 알고 있는 사물의 자연 질서를 유지해야 할 때마다 EnumMap을 사용한다.

키는 에넘스가 될 것이고 당신은 당신이 원하는 어떤 순서로 삽입할 수 있지만 당신이 그것을 반복할 때 열거된 순서 (자연적인 순서)에 반복될 것이다.

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

나는 정말로 enumMap을 사용하는 것이 깨끗한 읽을 수 있는 코드를 만드는 것을 발견한다.여기 예가 있다.

참조URL: https://stackoverflow.com/questions/683518/java-class-that-implements-map-and-keeps-insertion-order

반응형