0

次のようなデータを含むテキストファイルがあります。

Surrender~abc~nov@2012
Surrender~bnc~bhdgvx
Surrender~nkhjb~bcdjh
.
.
.

データを行ごとに分離し、2番目と3番目の列の値を2番目->キーと3番目->の値としてハッシュマップに格納し、ユーザーが入力した値がハッシュマップに存在するかどうかを確認してtrueを返します。

フォローしてみましたが、java.lang.ArrayIndexOutOfBoundsException: 3ガイドしてください。

HashMap hm = new HashMap();
FileInputStream fstream = new FileInputStream("Surrender.txt");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));

String strLine;
while ((strLine = br.readLine()) != null)   {
    String[] parts = strLine.split("~");
    for (int i = 0; i <= parts.length; i++) {
       if(!parts[i].equalsIgnoreCase("Surrender")){
    String key=parts[i];
    String value=parts[i++];
    if(key!=null && value!=null)
    hm.put(key,value);
}
    }
}

System.out.println("HashMap size..." + hm.size());
in.close();
4

3 に答える 3

2

各行は次のようになります。

Surrender~abc~nov@2012

で分割すると、次の 3 つの部分があります~

  • Surrender
  • abc
  • nov@2012

これらの部品には から0までの番号が付けられてい2ます。

解決策:をループしないでくださいparts。代わりにこれを行います:

hm.put(parts[1], parts[2]);

次の行を削除します。

for (int i=0;i<=parts.length;i++) {
    if (!parts[i].equalsIgnoreCase("Surrender")) {
        hm.put(parts[i], parts[++i]);
    }
}

注:ジェネリックを使用しますMap

Map<String, String> hm = new HashMap<>(); // Java 7
于 2012-11-05T11:12:39.810 に答える
0

これを置き換えます:

for (int i = 0; i <= parts.length; i++) {
    if (!parts[i].equalsIgnoreCase("Surrender")) {
        hm.put(parts[i], parts[++i]);
    }
}

if (parts.length > 2 && !parts[0].equalsIgnoreCase("Surrender")) {
    hm.put(parts[1], parts[2]);
}

質問で提供されるデータが常に 3 つの部分からなる場合は、スキップできますparts.length > 2

于 2012-11-05T11:14:52.447 に答える
0

まず、HashMap で型を使用してください...

HashMap<String, String> hm = new HashMap<String, String>();

第二に、固定サイズの場合、分割配列をループするのはなぜですか? また、カウンターをインクリメントする [++i] を使用して要素にアクセスすると、問題が生じると思います。分割を通るループの最後の繰り返しで、これにより範囲外になる可能性があります。

次のようなものを試してください:

if (parts[0].equalsIgnoreCase("Surrender")) {
    hm.put(parts[1], parts[2]);
}
于 2012-11-05T11:17:18.357 に答える