2017-04-03 3 views
0

ヒルズに関するデータを含むCSVファイルから読み込み中です。ファイルからデータを読み込み、列ヘッダーに6つのフィールドを関連付けることができます。現在、私の出力版画のように:Javaセットから特定の値を選択する

### County:Argyll and Bute 
[48,Deinn a'Choin,Argyll and Bute,768.2,56.281081,-4.659943, 49,Feinn a'Choin,Argyll and Bute,768.5,56.281043,-4.659924, 50,Zeinn a'Choin,Argyll and Bute,768.7,56.281034,-4.659981] 
### County:Stirling 
[19,Beinn Each,Stirling,813.0,56.313957,-4.262199, 11,Creag Gharbh,Stirling,637.4,56.46677,-4.221506, 7,Meall Buidhe,Stirling,719.0,56.419004,-4.308645] 
### County:Aberdeen 
    [19,Beinn Each,Aberdeen,813.0,56.313957,-4.262199, 11,Creag Gharbh,Aberdeen,637.4,56.46677,-4.221506, 7,Meall Buidhe,Aberdeen,719.0,56.419004,-4.308645] 

しかし、私はのように私の出力を取得しようとしています:だから技術的に私は、実際に内部にある私のSETから3つの値を選択されて達成しようとしているものを

### County:Argyll and Bute 
NameOfHill#1 Height 
NameOfHill#2 Height 
NameOfHill#3 Height 
### County:Stirling 
NameOfHill#1 Height 
NameOfHill#2 Height 
NameOfHill#3 Height 
### County:Aberdeen 
NameOfHill#1 Height 
NameOfHill#2 Height 
NameOfHill#3 Height 

を地図を表示し、名前と高さだけを印刷します。

私のコードは、現在、次のとおりです。私はループのための別のものを使用する必要が信じている

for (int i = 0; i < 3; i++) { 
     System.out.println("### County:" + hillsByCounty.keySet().toArray()[i]); 
     System.out.println(hillsByCounty.get((hillsByCounty.keySet().toArray())[i])); 
    } 
} 

、何とかセットからの唯一の3つの値を選択して、私の最終的な印刷に「.getName」と「.getHeight」を使用声明

私はライン

  Set<Hill> getHills = hillsByCounty.get((hillsByCounty.keySet().toArray())[i]); 
      for (int j = 0 ; j < 3 ; j++){ 
         //write to somehow code to pull the hill in pos j in this set 
         System.out.println(h.getName() + " " + h.getHeight()); 
      } 
     } 
    } 

しかし、何イムないわから沿って何かのアイデアは、これらの設定値を取得する方法、である持っていました。私の以前のメソッドが以下のように始まるので、私のマップ値はセットです:

public static Map<String, Set<Hill>> hillsByCounty(List<Hill> hills) { 

答えて

0

セットにはgetメソッドがありません。あなたはリストでそれを包むことができます。

List<Hill> hills = new ArrayList<>(hillsByCounty.get((hillsByCounty.keySet().toArray())[i])); 

代わりにfor-eachループを使用してください。最初の3枚だけを印刷する必要がある場合は、それを処理するカウンタを追加することができます。

int i = 0; 
for (Hill h : hills) { 
    //Can print here with h however you like 
    if (++i == 3) { 
     break; 
    } 
} 
0

あなたはまたのために、各ループとして知ら強化forループ、学ぶ必要があるように見えます。

あなたのコードは次のようになります。Javaの8で

int countyCount = 0; 
for (Map.Entry<String, Set<Hill>> entry : hillsByCounty(readHills()).entrySet()) { 
    System.out.println("### County:" + entry.getKey()); 
    int hillCount = 0; 
    for (Hill hill : entry.getValue()) { 
     System.out.println(hill.getName() + " " + hill.getHeight()); 
     if (++hillCount == 3) 
      break; 
    } 
    if (++countyCount == 5) 
     break; 
} 

、あなたはまた、ストリーミングを使用することができます

hillsByCounty(readHills()).entrySet() 
          .stream() 
          .limit(5) 
          .forEach(entry -> { 
    System.out.println("### County:" + entry.getKey()); 
    entry.getValue() 
     .stream() 
     .limit(3) 
     .map(h -> h.getName() + " " + h.getHeight()) 
     .forEach(System.out::println); 
}); 

参照:
のJavadoc - Map.entrySet()
のJava™チュートリアル - The for Statement
StackOverflow - What is the syntax of enhanced for loop in Java?
StackOverflow - Why is enhanced for loop efficient than normal for loop?

+0

ヒントをありがとう、 "エントリ" Javaのキーワードまたは私のセット/マップを参照していますか? –

+0

@godlypythonおっと!最初の行が 'entry'を正しく宣言するように変更されました。 – Andreas

+0

私は、現在このコードはセットのすべての項目を正しいものとして表示していますか?もし私が最初のforループを残しておくと、最初の3つの要素は表示されませんが、出力は3回繰り返されます。 –

関連する問題