0

HashMapsに奇妙な状況があります。HashMapのkeySet()を反復処理しているときに、値が重複しています。そして、値を取得しようとしている間、私はNULLを取得しました。

これが私のHashMap実装です:

    import java.util.ArrayList;
    import java.util.HashMap;

    public class StreetsMap extends HashMap<String, ArrayList<String[]>> {
        public void put(String key, String[] data) {
            ArrayList<String[]> current = get(key);
            if (current == null) {
                current = new ArrayList<String[]>();
                super.put(key, current);
            }
            current.add(data);
        }
    }

CSVファイルから行を読み取っているときに、HashMapに値を入力しています。
私はCSVでこのようなものを持っています(元のリストははるかに長いです):

Location_Code、Street_Name、Start、End、OddEven

01001, JustAStreet ST, 1, 11, odd
01001, JustAStreet ST, 17, 47, odd
... more of this
01001, JustAStreet ST, 2, 30, even
01001, JustAStreet ST, 40, 80, even
01001, AnotherStreet ST, 3, 27, odd
01001, AnotherStreet ST, 9, 51, odd
... and even more
01001, AnotherStreet ST, 0, 50, even
01001, AnotherStreet ST, 2, 14, even
01001, AnotherStreet ST, 0, 100, even

行をコンマで分割し、値をトリミングして、HashMapにデータを入力しています。

    String[] lines = inputText.split("\n");
    
    StreetsMap streetsData = new StreetsMap(); // 

    for (String line : lines) {
        String[] newLine = line.split(",");

        String[] streetData = new String[4];

        streetData[0] = newLine[0].trim();  // Location code
        streetData[1] = newLine[2].trim();  // Start
        streetData[2] = newLine[3].trim();  // End
        streetData[3] = newLine[4].trim();  // OddEven

        streetsData.put(newLine[1].trim(), streetData);

そして、問題はここから始まります。keySet()を反復処理する場合:

    for (String name : streetsData.keySet()) {
        System.out.println(name);
    }

私は次のようなものを持っています:

  • JustAStreet
  • AnotherStreet
  • AnotherStreet
  • JustAStreet
  • JustAStreet

HashMapを介した反復中に.get(key)メソッドを使用してデータにアクセスしようとすると、nullになることがあります。だから私は価値を失っています。:(

私の質問は、HashMapに重複したキーがあるのはどうして本当なのかということです。私が間違っていること。

UPD:キーはユニークです。別のクラスで問題が見つかりました。

4

1 に答える 1

3

HashMapに重複したキーがあるのはどうして本当ですか?私が間違っていること。

ほとんどの場合、文字列は完全に同じではありません。たとえば、同じようAStreetAStreet{space}見えますが、そうではありません。さらに悪いことに、幅のない文字がいくつかあります;)

Array.toString(text.getBytes())キーごとに印刷して、キーに含まれるバイト数を確認することをお勧めします。


マップに追加された後にキーを変更すると、重複するキー(取得できない)を取得できます。キーの追加後にキーのハッシュコードが変更された場合、それは間違った場所にある可能性があります。これは、反復すると表示されますが、プットで置き換える値としては表示されず、ゲットでは見つかりません。

つまり、hashcode、equals、またはcompareToでのフィールドの使用を変更しないように注意する必要があります。

于 2012-12-22T11:08:17.620 に答える