1

次のメンバーを含むクラスがあります

private String patientName;
private String patientPhoneNumber;

たとえば、電話番号に複数の名前が付けられています

1234567, AAA
1234567, BBB
8765432, CCC
8765432, GGG

今、私はそれらをマップに保存したいのですが、電話番号は複数の値を持つキーである必要があります。は電話番号です。コンソールで印刷したい場合はお知らせください。地図を繰り返し処理しますか

また、順序を維持したくないことにも注意してください。最初に値 AAA を取得し、次に BBB を取得するので、これらの順序も維持する必要があります。これは単なる例ですが、私のシナリオでは、バックエンドからこの値を取得します。注文を維持するためにも必要ですので、アドバイスしてください。

4

7 に答える 7

2

次のようなことを試すことができます:

HashMap<String,LinkedList<String>> map
于 2013-01-03T03:16:00.190 に答える
2
new Map<String, TreeSet<String>>()

TreeSet(ソートされた...)に値を保存できます。

それらを印刷するには:

for(Map.Entry entry : phoneBook.entries()){
    System.out.println(entry.key() + ":");
    TreeSet names = entry.value();
    for(String name : names){
        System.out.println("\t" + name);
    }
}

大文字と小文字を区別しない順序が必要な場合は、次のように追加できます。

TreeSet<String> nameSet = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
phoneBook.add(number, nameSet);
于 2013-01-03T03:16:39.113 に答える
2
private Map<String,List<String>> patients;

public void setPatientNumber(String number, String patient){
    List<String> list = patients.get(number);
    if(list == null){
        list = new ArrayList<String>();
        patients.put(number,list);
    }
    list.add(patient);
}
于 2013-01-03T03:17:58.000 に答える
1

各値にaLinkedHashMapと anを使用します。ArrayList

LinkedHashMap<String,ArrayList<String>> phoneNumbers = new LinkedHashMap<String,ArrayList<String>>();

// register new phone number
phoneNumbers.put("1234567", new ArrayList<String>());

// add names to the phone number
phoneNumbers.get("1234567").add("AAA");
phoneNumbers.get("1234567").add("BBB");

どちらのコレクションも挿入順序を保持します。

**編集**

ここで、これは大まかに必要なものです (これは多くのテストなしでその場で行われましたが、アイデアを得る必要があります)。順序は異なる場合があるため、重複を制限し、順序付けにコンパレータを提供することが望ましいと考えました(他の回答で示唆されているように):

public class LinkedMultiMap<K,V> {

    private Comparator<V> comparator;
    private LinkedHashMap<K,Set<V>> entries;

    public LinkedMultiMap() {
        this(null);
    }

    public LinkedMultiMap(Comparator<V> comparator) {
        this.comparator = comparator;
        this.entries = new LinkedHashMap<K, Set<V>>();
    }

    public boolean add(K key, V value) {
        if (!entries.containsKey(key)) {
            entries.put(key, new TreeSet<V>(comparator));
        }

        return entries.get(key).add(value);
    }

    public Collection<V> get(K key) {
        return entries.get(key);
    }

    public boolean remove(K key, V value) {
        boolean removed = false;
        if (entries.containsKey(key)) {
            removed = entries.get(key).remove(value);

            if (entries.get(key).isEmpty()) {
                entries.remove(key);
            }
        }
        return removed;
    }

    public Collection<V> removeAll(K key) {
        return entries.remove(key);
    }

    public Iterator<K> keyIterator() {
        return entries.keySet().iterator();
    }
}
于 2013-01-03T03:14:01.833 に答える
1

複数の値を単一のキーに関連付ける

それはMultimapです:

Map に似たコレクションですが、複数の値を 1 つのキーに関連付けることができます。

Google Collections のLinkedHashMultimapは、法案に合っているようです。

重複するキー値エントリを許可せず、データが multimap に追加された順序に従うイテレータを持つコレクションを返す Multimap の実装。

依存関係を追加したくない場合は、コレクションを値の型として使用できます。

Map<String /*number*/, List<String> /*names*/> numbers;

前者は挿入順にのみ取得できることに注意してください。変更できるようにしたい場合は、後者の手巻きソリューションを使用する必要があります

于 2013-01-03T03:14:26.370 に答える
0

を使用しMapてデータを保存します。キーはStringオブジェクトで、値はオブジェクトである必要がありListます。マップ エントリの値として a を使用するListと、複数の値を 1 つのキーに関連付けることができます。AListは、要素を追加する順序も維持します。

于 2013-01-03T03:14:18.013 に答える