3

216 個のエントリを含むがあるとします。 から最初の 100 個の値 (ここでは 型)LinkedHashMapを取得するにはどうすればよいでしょうか。ObjectLinkedHashMap<Integer, Object>

4

6 に答える 6

5

HashMapまず、タイトルどおりにこれを行うことはあまり意味HashMapがありません。特定の順序はなく、呼び出し間で順序が変わる場合があります。しかし、それはより理にかなってLinkedHashMapいます。

そこで、GuavaIterables.limit方法を使用します。

Iterable<Object> first100Values = Iterables.limit(map.values(), 100);

また

// Or whatever type you're interested in...
Iterable<Map.Entry<Integer, Object>> firstEntries =
    Iterables.limit(map.entrySet(), 100);

次に、それからリストを作成するか、それを反復処理するか、またはやりたいことが何でもできます。

于 2012-02-28T13:12:40.617 に答える
3

醜いワンライナー

この醜いワンライナーはそうするでしょう(そしてArrayList<Object>質問の場合にはaを返します):

Collections.list(Collections.enumeration(lhMap.values())).subList(0, 100)

これはHashMap同様に機能しますが、HashMapに裏打ちされて、HashSet入力された最初の100個の値を取得する保証はありません。他のタイプでも機能しますが、同様の制限があります。

ノート:

  • 比較的非効率的です(Javadocを読んで理由を確認してください-もっと悪いですが!)、
  • ビューを使用するときは注意してください(詳細については、Javadocをお読みください)。
  • 私はそれが醜いことを述べました。

ステップバイステップの使用例

(OPのコメントによる)

Map<Integer, Pair<Double, SelectedRoad>> hashmap3 =
  new LinkedHashMap<Integer, Pair<Double, SelectedRoad>>();

// [...] add 216 elements to hasmap3 here somehow

ArrayList<Pair<Double,SelectedRoad>> firstPairs = 
  Collections.list(Collections.enumeration(hashmap3.values())).subList(0, 100)

// you can then view your Pairs' SelectedRow values with them with:
//  (assuming that:
//    - your Pair class comes from Apache Commons Lang 3.0
//    - your SelectedRoad class implements a decent toString() )
for (final Pair<Double, SelectedRoad> p : firstPairs) {
    System.out.println("double: " + p.left);
    System.out.println("road  : " + p.right);
}
于 2012-02-28T19:47:33.490 に答える
3

できるよ:

Map<Integer, Object> records;
List<Entry<Integer, Object>> firstHundredRecords
    = new ArrayList<Entry<Integer, Object>>(records.entrySet()).subList(0, 100);

ただし、これによりマップからすべてのエントリがコピーされることに注意してください。

于 2012-02-28T13:15:25.933 に答える
3

ライブラリを使って必要なレコードだけをコピーしたい。

Map<Integer, Object> records;

List<Entry<Integer, Object>> firstHundredRecords = new ArrayList<>();
for(Entry<Integer, Object> entry : records.entrySet()) {
    firstHundredRecords.add(entry);
    if (firstHundredRecords.size()>=100) break;
}
于 2012-02-28T13:38:35.400 に答える
-1

カウンターをご利用いただけます。foreach ループは、カウンターが 100 に達すると終了します。

于 2012-02-28T13:11:54.080 に答える
-2

Iterator.next()a を100 回使用して停止するループを作成します。

NavigableMapandについて何か言おうとしSortedMapましたが、それらのインターフェイスはインデックスではなくキーの観点から定義されています。ただし、実際の根本的な問題が何であるかによっては、それでも役立つ場合があります。

于 2012-02-28T13:12:05.950 に答える