1

次のような Java コードがあります。

Map<Map<String,String>,String> map = new HashMap<>();
int i = 0;
try (BufferedReader br = new BufferedReader(new FileReader("properties.txt")))
{

        String sCurrentLine;
        while ((sCurrentLine = br.readLine()) != null) {
                i++;
                String[] parts = sCurrentLine.split(",");
                System.out.println(parts[2]);
                Map<String,String> tempMap = new HashMap<>();
                tempMap.put("issuing_bank",parts[1]);
                tempMap.put("card_switch",parts[2]);
                tempMap.put("card_Type",parts[3]);
                map.put(tempMap,parts[0]);
        }

} catch (IOException e) {
        e.printStackTrace();
}

my には、テキスト ファイルから保存されたmap最初の要素のみが含まれているのは奇妙に見えます。12デバッグの目的で、変数を使用してiそれを出力しました。これは22、テキスト ファイルの正確な数である の値を出力しています。

私のテキストファイルは次のようになります。

447747,ICCI,Visa,Credit
421323,ICCI,Visa,Debit
421630,ICCI,Visa,Debit
455451,ICCI,Visa,Debit
469375,ICCI,Visa,Debit
523951,ICCI,MasterCard,Credit
5399,ICCI,MasterCard,Debit
517652,HDFC,MasterCard,Credit
558818,HDFC,MasterCard,Credit 
512622,SBI,MasterCard,Credit
526468,SBI,MasterCard,Credit
400975,Citi,Visa,Credit
402856,Citi,Visa,Credit
461726,Citi,Visa,Credit
552004,Citi,MasterCard,Debit
468805,Axis,Visa,Debit
418157,ICCI,Visa,Debit
524133,Citi,MasterCard,Credit
528945,HDFC,MasterCard,Credit
437748,SBI,MasterCard,Credit
524111,HDFC,MasterCard,Credit
431757,SBI,Visa,Credit

12なぜ要素だけが my に読み込まれるのか、私は非常に混乱していmapます。ここで何か不足していますか?

前もって感謝します。

4

5 に答える 5

5

解決策は簡単です。次の行の引数の順序が間違っています。

map.put(tempMap,parts[0]);

それは言うべきです

map.put(parts[0],tempMap);

それに応じて、変数宣言の型パラメーターを変更する必要があります。あなたが持っている場所

Map<Map<String,String>,String> map = new HashMap<>();

あなたが入れなければならない

Map<String,Map<String,String>> map = new HashMap<>();

全体として、これらの変更の後、あなたが本当に望んでいた構造parts[0]、つまり残りのレコード フィールドのマップへのマップが得られると思います。

あなたのソリューション (あなたのニックネームに加えて:) は、Groovy のような動的言語で主にコーディングする開発者としてあなたを解放することを付け加えておきます。このスタイルは、Java の言語機能にうまく適合しません。Java では、特殊な Bean クラスを定義したほうがよいでしょう。

public class CardHolder {
  public final String cardNumber, issuingBank, cardSwitch, cardType;

  public CardHolder(String[] record) {
    int i = 0;
    cardNumber = record[i++];
    issuingBank = record[i++];
    cardSwitch = record[i++];
    cardType = record[i++];
  }
}

まず、このアプローチは、読み取りループがよりシンプルになり、要点が明確になるため、より優れています。

while ((sCurrentLine = br.readLine()) != null) {
  final CardHolder ch = new CardHolder(sCurrentLine.split(","));
  map.put(ch.cardNumber, ch);
}

また、これにより、レコードの他の側面をより細かく制御できます。たとえば、素敵な習慣toStringなどです。また、これによってコードが増えることはほとんどないことにも注意してください。関心の分離の原則によって再編成されただけです。

(最後にちょっとした観察: Java では、静的に型付けされた言語では冗長であるため、String 変数への s プレフィックスは習慣的ではありません。Java では、String があった場所で Integer が発生するためにバグに遭遇することは決してないので安心してください。期待される。)

于 2012-10-10T12:43:04.673 に答える
2

マップの作成方法を変更する必要があります。以下の宣言の代わりに: -

Map<Map<String,String>,String> map = new HashMap<>();

これではなく、次のものが必要です: -

Map<String, Map<String,String>> map = new HashMap<>();

Map のキーとして、常に不変の型が必要です。

そして、この変更の後、変更する必要があります: -

map.put(tempMap,parts[0]);

に: -

map.put(parts[0], tempMap);
于 2012-10-10T12:44:59.520 に答える
1

私はあなたが引数を持っていると思います

map.put(tempMap,parts[0]);

逆。tempMap を数値にマッピングしていますが、おそらく数値を tempMap にマッピングする必要があります。

map.put(parts[0], tempMap);

使用する

Map<String, Map<String,String>> map = new HashMap<>();
于 2012-10-10T12:44:04.947 に答える
1

HashMap の等価性はキーと値のペアに基づいているため、Map を値として使用する必要があります。.

map.put(parts[0],tempMap);

以下の簡単なプログラムは、この事実を説明します

    Map<String, String> tempMap1 = new HashMap<String, String>();
    tempMap1.put("issuing_bank", "ICICI");
    tempMap1.put("card_switch", "Visa");
    tempMap1.put("card_Type", "Debit");

    Map<String, String> tempMap2 = new HashMap<String, String>();

    tempMap2.put("issuing_bank", "ICICI");
    tempMap2.put("card_switch", "Visa");
    tempMap2.put("card_Type", "Debit");

    System.out.println(tempMap1.equals(tempMap2));//Prints true

出力:

true

したがって、宣言は以下のようになります。HashMap では常に不変オブジェクトをキーとして使用する必要があることに注意してください。

Map<String,Map<String,String>> map = new HashMap<String,Map<String,String>>();
于 2012-10-10T12:44:32.910 に答える
-1

これは、マップ (tempMap) をキーとして使用しているためです。これは間違っています。

于 2012-10-10T12:42:16.590 に答える