0

マップを印刷して、各印刷ステートメントのキーと値の両方を表示しようとしています。キーと値が重複しています。例えば:

key -> value
house -> dog
house -> cat
dog -> house
dog -> cat
cat -> house
cat -> bike

これは私のテキストファイルです:

house   cat
house   dog
house   index
cat bike
cat house
cat index
dog house
dog cat
dog index

何らかの理由で、私のコードは実際の値ではなく文字列「index」を出力しています。私のコードはここにあります:

//adding values from a text file of two words per line.
//those two words per line in the text file are tab delimitted

public static Map<String, String> animals = new HashMap<String, String>(); 
BufferedReader in = new BufferedReader(new InputStreamReader("animals.txt"));
String current_line;
String[] splitted_strings = new String[1];
while ((current_line = in.readLine()) != null){
   splitted_strings = current_line.split("\t");
   animals.put(splitted_strings[0], splitted_strings[1]);
}

//print statement
for(Map.Entry entry : animals.entrySet()) 
   System.out.println(entry.getValue() + " " + entry.getKey());

以下に示すコードからの単純なprintステートメントからの出力は次のようになります。

index cat
index house
index dog

上記のようなキーペアを維持するために、これらの値をデータ構造に追加するにはどうすればよいですか?どうすれば出力をこれにすることができますか?:

house cat
house dog
house index
cat bike
cat house
cat index
dog house
dog cat
dog index
4

2 に答える 2

5

キーと値が重複しています。

いいえ、しません。ではありませんMap<K,V>。キーは定義上一意です。

キーごとに複数の値が必要な場合は、Guavaのようなもの必要ですMultimap

ただし、提示したコードが実際にすべての値の「インデックス」を出力している場合は、最初からマップが正しくない可能性が高く、人口コードにバグがあります(これはわかりません)。 。(または、値としてカスタムクラスを使用していて、そのtoStringメソッドが常に「インデックス」を返す場合。)

一歩下がって、代わりに人口コードを確認する必要があります。

編集:私はあなたのサンプルコードをコンパイルするのに十分なだけ修正しました:

import java.io.*;
import java.util.*;

public class Test {

    public static void main(String[] args) throws IOException {
        Map<String, String> animals = new HashMap<String, String>(); 
        BufferedReader in = new BufferedReader
            (new InputStreamReader(new FileInputStream("animals.txt")));
        String current_line;
        String[] splitted_strings = new String[1];
        while ((current_line = in.readLine()) != null){
            splitted_strings = current_line.split("\t");
            animals.put(splitted_strings[0], splitted_strings[1]);
        }
        for(Map.Entry entry : animals.entrySet()) 
            System.out.println(entry.getValue() + " " + entry.getKey());
    }
}

そして、animals.txtで:

key1    value1
key2    value2
key3    value3
key4    value4

出力は次のとおりです。

value4 key4
value3 key3
value2 key2
value1 key1

「インデックス」の兆候はまったくありません。つまり、それが実際の人口コードではないか(コンパイルエラーを除く)、テキストファイルにすべての値の「インデックス」があります...

于 2013-03-07T00:39:40.170 に答える
1

Guavaを使用する代わりに、に基づいて独自のマルチマップをロールすることができますMap<String,Set<String>>

キーと値のペアを追加するときは、最初にキーがすでに存在するかどうかを確認します。そうでない場合は、新しい値のみを含むセットを入れてください。キーがすでに存在する場合は、そのセットを取得して新しい値を追加します。

ペアが存在するかどうかを確認するには、キーのセットを取得し、値が含まれているかどうかを確認します。

于 2013-03-07T02:45:30.120 に答える