162

LinkedHashMapキーがマップに入力された順序が重要であるため、使用しました。

しかし今、私は最初の場所(最初に入力されたエントリ)または最後にキーの値を取得したいと考えています。

first()andlast()またはそのようなメソッドが必要ですか?

最初のキー エントリを取得するためだけにイテレータが必要ですか? それが私が使用した理由LinkedHashMapです!

ありがとう!

4

16 に答える 16

180

のセマンティクスは、 のセマンティクスでLinkedHashMapはなく、依然として MapのセマンティクスですLinkedList。はい、挿入順序を保持しますが、それはインターフェースの側面ではなく、実装の詳細です。

「最初の」エントリを取得する最も簡単な方法はまだentrySet().iterator().next()です。「最後の」エントリを取得することは可能.next()ですが、最後に到達するまで呼び出してエントリ セット全体を反復処理する必要があります。 while (iterator.hasNext()) { lastElement = iterator.next() }

編集: ただし、JavaSE API を超えることを希望する場合、Apache Commons Collectionsには独自のLinkedMap実装があり、探していることを実行するfirstKeyや などのメソッドがあります。lastKeyインターフェイスはかなり豊富です。

于 2009-12-20T17:58:01.457 に答える
29

次のようなことを試していただけますか (最後のエントリを取得するため):

linkedHashMap.entrySet().toArray()[linkedHashMap.size() -1];
于 2016-04-19T07:25:57.137 に答える
6

LinkedHashMap の最初と最後のエントリを取得するもう 1 つのtoArray()方法は、Set インターフェイスのメソッドを使用することです。

しかし、エントリ セット内のエントリを繰り返し処理し、最初と最後のエントリを取得する方が良い方法だと思います。

配列メソッドを使用すると、「...準拠するには未チェックの変換が必要」という形式の警告が表示されますが、これは修正できません[ただし、注釈を使用することによってのみ抑制できます@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
于 2009-12-21T05:12:19.877 に答える
4

おそらくこのようなもの:

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;
}
于 2013-03-22T00:03:42.023 に答える
2

提案:

map.remove(map.keySet().iterator().next());
于 2016-03-31T15:27:41.580 に答える
1

メソッドを持つConcurrentSkipListMapfirstKey()を使用することをお勧めしますlastKey()

于 2012-09-19T22:43:55.977 に答える
1
        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;
           }
        }
于 2020-11-10T08:16:48.420 に答える
1

linkedHashMap は、最初、最後、または特定のオブジェクトを取得する方法を提供していません。

しかし、取得するのはかなり簡単です:

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

alオブジェクトでイテレータを使用するようになりました。任意のオブジェクトを取得できます。

于 2012-11-07T07:14:42.287 に答える
0

はい、同じ問題に遭遇しましたが、幸いなことに最初の要素だけが必要です... -これが私がしたことです。

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

最後の要素も必要な場合-マップの順序を逆にする方法を調べます-一時変数に保存し、逆マップの最初の要素にアクセスします(したがって、最後の要素になります)、一時変数。

ハッシュマップの順序を逆にする方法に関するいくつかの良い答えを次に示します。

Javaでハッシュマップを逆順に繰り返す方法

上記のリンクからヘルプを使用する場合は、賛成票を投じてください:)これが誰かの助けになることを願っています.

于 2013-07-26T15:04:56.707 に答える