programing

Java LinkedHashMap이 처음 또는 마지막 항목을 가져옵니다.

goodsources 2022. 8. 30. 22:34
반응형

Java LinkedHashMap이 처음 또는 마지막 항목을 가져옵니다.

지도에 키를 입력하는 순서가 중요하기 때문에 사용해 왔습니다.

여기서 처음 입력된 항목(첫 번째 입력된 항목) 또는 마지막으로 키의 값을 얻고 싶습니다.

요?first() ★★★★★★★★★★★★★★★★★」last()뭐런거?

첫 번째 키 입력만 하려면 반복기가 있어야 하나요?그게 내가 사용한 이유야!

감사합니다!

「 」의 LinkedHashMap이다.LinkedList삽입 순서는 유지되지만 인터페이스의 측면이 아니라 구현 세부 사항입니다.

번째' 를 얻는 가장 '첫 번째' 엔트리를 입니다.entrySet().iterator().next() "" 수 "마지막" 엔트리를 호출하여 .next()마지막이 될 때까지. while (iterator.hasNext()) { lastElement = iterator.next() }

edit: 단, JavaSE API를 넘어서고 싶다면 Apache Commons Collections에는 자체 구현이 있으며, 및 같은 메서드가 있어 원하는 기능을 수행합니다.인터페이스는 상당히 풍부합니다.

(마지막 엔트리를 취득하기 위해) 다음과 같은 조작을 시도해 볼 수 있습니까?

linkedHashMap.entrySet().toArray()[linkedHashMap.size() -1];

제가 너무 늦게 온 것은 알지만, 저는 몇 가지 대안을 제안하고 싶습니다. 특별한 것이 아니라 여기에서는 언급되지 않은 몇 가지 사례입니다.효율성은 그다지 중시하지 않지만, 보다 심플한 것을 요구하고 있는 경우(아마도 코드 한 줄의 마지막 엔트리 값을 찾을 수 있을 것이다), Java 8의 등장으로 이 모든 것이 매우 심플하게 됩니다.이러한 시나리오를 제시하겠습니다.

완전성을 확보하기 위해서, 이 투고에 기재되어 있는 어레이의 솔루션과 다른 유저가 비교합니다.모든 케이스를 정리하면, 특히 새로운 개발자에게 있어서 도움이 된다고 생각합니다(퍼포먼스가 중요하거나 중요하지 않을 때). 항상 각각의 문제에 의존합니다.

가능한 대체 방법

어레이 방식 사용법

나는 아래의 비교를 하기 위해 앞의 답변에서 그것을 따왔다.이 솔루션은 @feresr에 속합니다.

  public static String FindLasstEntryWithArrayMethod() {
        return String.valueOf(linkedmap.entrySet().toArray()[linkedmap.size() - 1]);
    }

ArrayList 메서드 사용방법

퍼포먼스가 조금 다른 최초의 솔루션과 유사합니다.

public static String FindLasstEntryWithArrayListMethod() {
        List<Entry<Integer, String>> entryList = new ArrayList<Map.Entry<Integer, String>>(linkedmap.entrySet());
        return entryList.get(entryList.size() - 1).getValue();
    }

축소 방법

이 메서드는 스트림의 마지막 요소를 가져올 때까지 요소 집합을 줄입니다.또한 결정론적 결과만 반환합니다.

public static String FindLasstEntryWithReduceMethod() {
        return linkedmap.entrySet().stream().reduce((first, second) -> second).orElse(null).getValue();
    }

Skip Function 메서드

이 메서드는 스트림의 마지막 요소를 얻기 전에 모든 요소를 건너뛰는 것만으로 가져옵니다.

public static String FindLasstEntryWithSkipFunctionMethod() {
        final long count = linkedmap.entrySet().stream().count();
        return linkedmap.entrySet().stream().skip(count - 1).findFirst().get().getValue();
    }

반복 가능한 대안

Iterables.getGuava의 마지막 버전입니다.Lists 및 SortedSets에 대해서도 어느 정도 최적화되어 있습니다.

public static String FindLasstEntryWithGuavaIterable() {
        return Iterables.getLast(linkedmap.entrySet()).getValue();
    }

다음은 전체 소스 코드입니다.

import com.google.common.collect.Iterables;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class PerformanceTest {

    private static long startTime;
    private static long endTime;
    private static LinkedHashMap<Integer, String> linkedmap;

    public static void main(String[] args) {
        linkedmap = new LinkedHashMap<Integer, String>();

        linkedmap.put(12, "Chaitanya");
        linkedmap.put(2, "Rahul");
        linkedmap.put(7, "Singh");
        linkedmap.put(49, "Ajeet");
        linkedmap.put(76, "Anuj");

        //call a useless action  so that the caching occurs before the jobs starts.
        linkedmap.entrySet().forEach(x -> {});



        startTime = System.nanoTime();
        FindLasstEntryWithArrayListMethod();
        endTime = System.nanoTime();
        System.out.println("FindLasstEntryWithArrayListMethod : " + "took " + new BigDecimal((endTime - startTime) / 1000000.000).setScale(3, RoundingMode.CEILING) + " milliseconds");


         startTime = System.nanoTime();
        FindLasstEntryWithArrayMethod();
        endTime = System.nanoTime();
        System.out.println("FindLasstEntryWithArrayMethod : " + "took " + new BigDecimal((endTime - startTime) / 1000000.000).setScale(3, RoundingMode.CEILING) + " milliseconds");

        startTime = System.nanoTime();
        FindLasstEntryWithReduceMethod();
        endTime = System.nanoTime();

        System.out.println("FindLasstEntryWithReduceMethod : " + "took " + new BigDecimal((endTime - startTime) / 1000000.000).setScale(3, RoundingMode.CEILING) + " milliseconds");

        startTime = System.nanoTime();
        FindLasstEntryWithSkipFunctionMethod();
        endTime = System.nanoTime();

        System.out.println("FindLasstEntryWithSkipFunctionMethod : " + "took " + new BigDecimal((endTime - startTime) / 1000000.000).setScale(3, RoundingMode.CEILING) + " milliseconds");

        startTime = System.currentTimeMillis();
        FindLasstEntryWithGuavaIterable();
        endTime = System.currentTimeMillis();
        System.out.println("FindLasstEntryWithGuavaIterable : " + "took " + (endTime - startTime) + " milliseconds");


    }

    public static String FindLasstEntryWithReduceMethod() {
        return linkedmap.entrySet().stream().reduce((first, second) -> second).orElse(null).getValue();
    }

    public static String FindLasstEntryWithSkipFunctionMethod() {
        final long count = linkedmap.entrySet().stream().count();
        return linkedmap.entrySet().stream().skip(count - 1).findFirst().get().getValue();
    }

    public static String FindLasstEntryWithGuavaIterable() {
        return Iterables.getLast(linkedmap.entrySet()).getValue();
    }

    public static String FindLasstEntryWithArrayListMethod() {
        List<Entry<Integer, String>> entryList = new ArrayList<Map.Entry<Integer, String>>(linkedmap.entrySet());
        return entryList.get(entryList.size() - 1).getValue();
    }

    public static String FindLasstEntryWithArrayMethod() {
        return String.valueOf(linkedmap.entrySet().toArray()[linkedmap.size() - 1]);
    }
}

다음은 각 메서드의 성능에 대한 출력입니다.

FindLasstEntryWithArrayListMethod : took 0.162 milliseconds
FindLasstEntryWithArrayMethod : took 0.025 milliseconds
FindLasstEntryWithReduceMethod : took 2.776 milliseconds
FindLasstEntryWithSkipFunctionMethod : took 3.396 milliseconds
FindLasstEntryWithGuavaIterable : took 11 milliseconds

LinkedHashMap자바 8은 자바 8입니다.성능에 문제가 있거나 맵의 크기가 큰 경우 반사를 통해 해당 필드에 액세스할 수 있습니다.

구현이 변경될 수 있기 때문에 폴백 전략을 세우는 것도 좋은 방법일 것입니다.예외가 발생하면 구현이 변경되었음을 알 수 있도록 기록할 수 있습니다.

다음과 같은 경우가 있습니다.

public static <K, V> Entry<K, V> getFirst(Map<K, V> map) {
  if (map.isEmpty()) return null;
  return map.entrySet().iterator().next();
}

public static <K, V> Entry<K, V> getLast(Map<K, V> map) {
  try {
    if (map instanceof LinkedHashMap) return getLastViaReflection(map);
  } catch (Exception ignore) { }
  return getLastByIterating(map);
}

private static <K, V> Entry<K, V> getLastByIterating(Map<K, V> map) {
  Entry<K, V> last = null;
  for (Entry<K, V> e : map.entrySet()) last = e;
  return last;
}

private static <K, V> Entry<K, V> getLastViaReflection(Map<K, V> map) throws NoSuchFieldException, IllegalAccessException {
  Field tail = map.getClass().getDeclaredField("tail");
  tail.setAccessible(true);
  return (Entry<K, V>) tail.get(map);
}

Linked 첫 엔트리와 또 은 Linked Hash Map을 사용하는 입니다.toArray()set interface '인터페이스'를 설정합니다.

그러나 엔트리 세트의 엔트리를 반복하여 첫 번째 엔트리와 마지막 엔트리를 얻는 것이 더 좋은 방법이라고 생각합니다.

배열 메서드를 사용하면 "...에 적합하도록 선택되지 않은 변환 필요" 형식이 경고됩니다. 이 형식은 수정할 수 없습니다. 단, 주석을 사용해야만 억제할 수 있습니다.@SuppressWarnings("unchecked") ] ]

에서는 '먹다'의 .toArray()★★★★

    public static void main(final String[] args) {
        final Map<Integer,String> orderMap = new LinkedHashMap<Integer,String>();
        orderMap.put(6, "Six");
        orderMap.put(7, "Seven");
        orderMap.put(3, "Three");
        orderMap.put(100, "Hundered");
        orderMap.put(10, "Ten");

        final Set<Entry<Integer, String>> mapValues = orderMap.entrySet();
        final int maplength = mapValues.size();
        final Entry<Integer,String>[] test = new Entry[maplength];
        mapValues.toArray(test);

        System.out.print("First Key:"+test[0].getKey());
        System.out.println(" First Value:"+test[0].getValue());

        System.out.print("Last Key:"+test[maplength-1].getKey());
        System.out.println(" Last Value:"+test[maplength-1].getValue());
    }

    // the output geneated is :
    First Key:6 First Value:Six
    Last Key:10 Last Value:Ten

더러우긴 , 더러움, 더러움, 더러움, 더러움, 더러움, 더러움, 더러움, 더러움, 더러움, 더러움, 더러움, 더러움, 더러움, 더러움, , 더러움.removeEldestEntryLinkedHashMap의 메서드는 개인 익명 구성원으로서 수행하는 것이 적합할 수 있습니다.

private Splat eldest = null;
private LinkedHashMap<Integer, Splat> pastFutures = new LinkedHashMap<Integer, Splat>() {

    @Override
    protected boolean removeEldestEntry(Map.Entry<Integer, Splat> eldest) {

        eldest = eldest.getValue();
        return false;
    }
};

항상 첫 는 '우리 집'에서 볼 수.eldest매번 업데이트 .put.

수 .put를 설정합니다.youngest

    @Override
    public Splat put(Integer key, Splat value) {

        youngest = value;
        return super.put(key, value);
    }

엔트리를 삭제하기 시작하면 모든 것이 망가집니다.그런데 아직 크러지를 제거할 방법을 찾지 못했습니다.

머리나 꼬리에 합리적인 방법으로 접근할 수 없다는 것은 매우 짜증나는 일입니다.

아마도 다음과 같습니다.

LinkedHashMap<Integer, String> myMap;

public String getFirstKey() {
  String out = null;
  for (int key : myMap.keySet()) {
    out = myMap.get(key);
    break;
  }
  return out;
}

public String getLastKey() {
  String out = null;
  for (int key : myMap.keySet()) {
    out = myMap.get(key);
  }
  return out;
}

제안:

map.remove(map.keySet().iterator().next());

다음과 같은 ConcurrentSkipListMap을 사용하는 것이 좋습니다.firstKey() ★★★★★★★★★★★★★★★★★」lastKey()

번째 에는 " "를 사용합니다.entrySet().iterator().next()1번으로 하다지지으로putputputputputputputputputputputputputputputputputputputputputputputput하다.

linkedHashMap은 처음, 마지막 또는 특정 개체를 가져오는 메서드를 제공하지 않습니다.

그러나 얻는 것은 매우 간단합니다.

Map<Integer,String> orderMap = new LinkedHashMap<Integer,String>();  
Set<Integer> al =   orderMap.keySet();

이제 반복기 사용alobject ; 임의의 오브젝트를 얻을 수 있습니다.

        import java.util.Arrays;
        import java.util.LinkedHashMap;
        import java.util.List;
        import java.util.Map;

        public class Scratch {
           public static void main(String[] args) {

              // Plain java version

              Map<String, List<Integer>> linked = new LinkedHashMap<>();
              linked.put("a", Arrays.asList(1, 2, 3));
              linked.put("aa", Arrays.asList(1, 2, 3, 4));
              linked.put("b", Arrays.asList(1, 2, 3, 4, 5));
              linked.put("bb", Arrays.asList(1, 2, 3, 4, 5, 6));

              System.out.println("linked = " + linked);

              String firstKey = getFirstKey(linked);
              System.out.println("firstKey = " + firstKey);
              List<Integer> firstEntry = linked.get(firstKey);
              System.out.println("firstEntry = " + firstEntry);

              String lastKey = getLastKey(linked);
              System.out.println("lastKey = " + lastKey);
              List<Integer> lastEntry = linked.get(lastKey);
              System.out.println("lastEntry = " + lastEntry);



           }

           private static String getLastKey(Map<String, List<Integer>> linked) {
              int index = 0;
              for (String key : linked.keySet()) {
             index++;
             if (index == linked.size()) {
                return key;
             }
              }
              return null;
           }

           private static String getFirstKey(Map<String, List<Integer>> linked) {
              for (String key : linked.keySet()) {
             return key;
              }
              return null;
           }
        }

Java8 스트림을 사용하면 이 작업을 매우 쉽게 수행할 수 있습니다.

LinkedHashMap<String, Integer> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("A", 1);
linkedHashMap.put("B", 2);
linkedHashMap.put("C", 3);
linkedHashMap.put("D", 4);

//First entry
Map.Entry<String, Integer> firstEntry = linkedHashMap.entrySet().stream().findFirst().get();

//Last entry
Map.Entry<String, Integer> lastEntry = linkedHashMap.entrySet().stream().skip(linkedHashMap.size() - 1).findFirst().get();

네, 저도 같은 문제에 부딪혔지만 다행히 첫 번째 요소만 있으면... - 이게 제가 한 일이에요.

private String getDefaultPlayerType()
{
    String defaultPlayerType = "";
    for(LinkedHashMap.Entry<String,Integer> entry : getLeagueByName(currentLeague).getStatisticsOrder().entrySet())
    {
        defaultPlayerType = entry.getKey();
        break;
    }
    return defaultPlayerType;
}

마지막 요소도 필요한 경우 - 맵의 순서를 반대로 하는 방법을 알아보고, 반전된 맵의 첫 번째 요소에 액세스하여(따라서 마지막 요소가 됩니다), temp 변수를 종료합니다.

다음은 해시맵을 역순으로 정렬하는 방법에 대한 몇 가지 좋은 답변입니다.

Java에서 해시맵을 역순으로 반복하는 방법

위 링크의 도움말을 사용하는 경우 투표에 응해주세요:) 이것이 누군가에게 도움이 되기를 바랍니다.

오른쪽 링크 리스트가 끝날 때까지 수동으로 키 세트를 열거한 후 키별로 엔트리를 가져와 이 엔트리를 반환해야 합니다.

public static List<Fragment> pullToBackStack() {
    List<Fragment> fragments = new ArrayList<>();
    List<Map.Entry<String, Fragment>> entryList = new ArrayList<>(backMap.entrySet());
    int size = entryList.size();
    if (size > 0) {
        for (int i = size - 1; i >= 0; i--) {// last Fragments
            fragments.add(entryList.get(i).getValue());
            backMap.remove(entryList.get(i).getKey());
        }
        return fragments;
    }
    return null;
}

언급URL : https://stackoverflow.com/questions/1936462/java-linkedhashmap-get-first-or-last-entry

반응형