2017-12-21 14 views
-2

は、私は、通常のC#を使用するとJava APIに精通していないですが、ここで私が何をしたいです:Javaのソートのキーと値のコレクション

私は2つの配列があります。

String[] names = concertNames.toArray(new String[concertNames.size()]); 
Double[] rates = concertRates.toArray(new Double[concertRates.size()]); 

各要素からのnamesは、ratesの要素に対応します。つまり、names[i]のレートは、rates[i]です。

N個の最高級コンサートの名前を取得したいと思います。 C#ではLINQを使用しますが、ここではわかりません。

編集:オフトピックですか?あなたは真剣な人ですか?私は配列をソートする方法を知っています、ちょっとしたことをするために恐ろしい、初歩的なコードの50行を書こうとしません。

String[] topNames = 
    IntStream.range(0, rates.length) 
      .boxed() 
      .sorted(Comparator.comparing(i -> -1 * rates[i])) 
      .limit(N) 
      .map(i -> names[i]) 
      .toArray(String[]::new); 
+3

少なくとも2行のコードを書いてください!!!!どのようにこの質問にはいくつかのupvotesがあります! – Ele

+0

[LINQに対応するJavaとは何か?](https://stackoverflow.com/questions/1217228/what-is-the-java-equivalent-for-linq)の可能な複製 –

+0

なぜ並列配列を使用するのですか?コンサートごとに 'name'と' rate'を保持するオブジェクトの配列? –

答えて

2

neatest方法は、インデックスをストリーム彼らの料金でそれらを並べ替えた後、自分の名前にマッピングすることです。 inqはLINQ形式のクエリをJavaで利用できるようにします

+0

素晴らしいです、ありがとう! – Eutherpy

+1

OPは* "N個の最高のコンサートの名前" *を望んでいるので、最高のコンサートを保持するための 'limit()'には、ソートを降順にする必要があります。 '.sorted(Comparator.comparing((Integer i) - > rates [i])。reversed())'を実行します。 – Andreas

+0

@Andreas良いキャッチ、ありがとう。編集され、修正されました。 – Mureinik

1

namesの要素とratesの要素の間に関係があることを考慮して、これらの2つのフィールドをカプセル化するクラスを作成することをお勧めします。レートに基づいてオブジェクトをソートし、関連するデータも維持します。

もう1つの方法は、Map<String, Double>を作成し、それぞれの名前が対応するレートにマッピングされるようにすることです。

あなたはこのようなタスクを達成することができる2つの言ったフィールドをカプセル化するために、独自のクラスを作成するための最初の提案を続行することにした場合:

NameOfClass[] topRated = myList.stream() 
       .sorted(Comparator.comparingDouble(NameOfClass::getRate).reversed()) 
       .limit(10) // Top N 
       .toArray(NameOfClass[]::new); 

あなたが提案地図のアプローチを続行することにした場合、このようなもので十分でしょう:

Map<String, Double> resultSet = myMap.entrySet() 
     .stream() 
     .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) 
     .limit(10) // Top N 
     .collect(Collectors.toMap(Entry::getKey, Entry::getValue, 
         (oldValue, newValue) -> ... , LinkedHashMap::new)); 
関連する問題