TreeMapがうまくソートされない
【入門者向けトレーニング】Javaの練習問題:知識
(https://eng-entrance.com/java-question-knowledge#javaio-2)
の練習問題5をそのまま実施したところ、1行目の要素(IBARAKI 水戸市)が何故か一番最後に表示されてしまいます。
回答欄1のソースコードをコピーしても、同様の表示になってしまいました。
要素自体に誤りがあるのかと思い、他の値と行位置を変更しても、1行目となった要素は常に最後に表示されてしまいます。
ソースコードの誤りではないと思いますが、HashMap固有の問題なのか、解決方法をご教示ください。
該当のソースコード
java
1import java.io.BufferedReader; 2import java.io.FileInputStream; 3import java.io.FileNotFoundException; 4import java.io.IOException; 5import java.io.InputStreamReader; 6import java.util.Map; 7import java.util.TreeMap; 8 9public class Know5_190126 { 10 11 public static void main(String[] args) { 12 // TODO 自動生成されたメソッド・スタブ 13 14 String st = "C://Users/Test/Desktop/"; 15 String file = "TextA.txt"; 16 17 try { 18 // ファイルの読み込み 19 FileInputStream fis = new FileInputStream(st + file); 20 InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); 21 BufferedReader bf = new BufferedReader(isr); 22 23 // Mapの宣言 24 Map<String, String> map = new TreeMap<String, String>(); 25 26 // 行ごとに読み込み、半角スペースで分ける 27 String text; 28 while((text = bf.readLine()) != null) { 29 String[] param = text.split(" "); 30 31 // mapへ読み込み 32 for(int i = 0; i < param.length -1; i++) { 33 map.put(param[i], param[i+1]); 34 } 35 36 } 37 38 isr.close(); 39 40 System.out.println(map); 41 42 // Mapの要素を表示 43 for(Map.Entry<String, String> e : map.entrySet()) { 44 System.out.println(e.getKey() + " : " + e.getValue()); 45 } 46 47 48 } 49 catch(FileNotFoundException fnfe) { 50 fnfe.getStackTrace(); 51 } 52 catch(IOException ioe) { 53 ioe.getStackTrace(); 54 } 55 56 } 57 58}
ContainsKeyを追記したコード
java
1import java.io.*; 2import java.util.*; 3 4public class Know5_190127 { 5 6 public static void main(String[] args) throws Exception { 7 // TODO 自動生成されたメソッド・スタブ 8 9 String st = "C://Users/Test/Desktop/"; 10 String file = "TextA.txt"; 11 12 try { 13 // ファイルの読み込み 14 FileInputStream fis = new FileInputStream(st + file); 15 InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); 16 BufferedReader bf = new BufferedReader(isr); 17 18 // Mapの宣言 19 Map<String, String> map = new TreeMap<String, String>(); 20 21 // 行ごとに読み込み、半角スペースで分ける 22 String text; 23 while((text = bf.readLine()) != null) { 24 String[] param = text.split(" "); 25 26 // mapへ読み込み 27 for(int i = 0; i < param.length -1; i++) { 28 map.put(param[i], param[i+1]); 29 } 30 31 } 32 33 isr.close(); 34 35 System.out.println(map); 36 System.out.println(map.size()); 37 38 System.out.println(map.containsKey("GUNMA")); 39 System.out.println(map.containsKey("IBARAKI")); 40 41 // Mapの要素を表示 42 for(Map.Entry<String, String> e : map.entrySet()) { 43 System.out.println(e.getKey() + " : " + e.getValue()); 44 } 45 46 47 } 48 catch(FileNotFoundException fnfe) { 49 fnfe.getStackTrace(); 50 } 51 catch(IOException ioe) { 52 ioe.getStackTrace(); 53 } 54 } 55} 56
TextA.txtの中身(jimbesさん指摘分)
IBARAKI 水戸市 TOCHIGI 宇都宮市 GUNMA 前橋市 SAITAMA さいたま市 CHIBA 千葉市 TOKYO 東京(新宿区) KANAGAWA 横浜市
試したこと
・「IBARAKI 水戸市」の変更(例:AIBARAKI 水戸市)
・行ごとの位置の変更(例:TOKYOを1行目に)
補足情報(FW/ツールのバージョンなど)
Eclipse Version: Photon Release (4.8.0)
回答2件
あなたの回答
tips
プレビュー