Nie jestem do końca pewien jakie są twoje potrzeby (lub konkretny przypadek użycia), ale spróbuję zgadnąć. Inne odpowiedzi sugerują użycie Linked * Multimap lub Immutable, ale aby uzyskać pożądany wynik (pokazany w pytaniu) z Multimap
będziesz musiał stworzyć jakąś fantazyjną Mapę (omówię to później) lub na przykład utworzę trzy tymczasowe kolekcje zawierające pierwsze, drugie i trzecie wartości dla każdego klucza (będą one w kolejności wstawiania, jeśli użyjesz jednej z sugerowanych implementacji Multimap
). Korzystnie byłoby jedną ListMultimaps
jak można iterować multimap.keySet()
dostać list z wartościami dostępnymi przez index:
final ListMultimap<String,String> multimap = LinkedListMultimap.create();
// put values from question here
final List<Object> firstValues = Lists.newArrayList();
for (final String key: multimap.keySet()) {
firstValues.add(multimap.get(key).get(0));
}
System.out.println(firstValues);
// prints [value1, value11, value111]
// similar for multimap.get(key).get(1) and so on
ale minusem jest to, że trzeba będzie utworzyć trzy listy do ciebie przykład, co czyni to rozwiązanie raczej nieelastyczny.Więc może to będzie lepiej umieścić {pierwszy, drugi, trzeci} Wartości kolekcję na mapie>, co doprowadza mnie do punktu:
Może należy użyć Table zamiast?
Table został zaprojektowany jako kolekcji, która kojarzy uporządkowaną parę kluczy, zwany klucz wiersza i kolumny klucza, z jednej wartości i, co ważniejsze, tutaj ma wiersza i kolumny poglądy. Użyję ArrayTable
tutaj:
final ArrayTable<String, Integer, Object> table = ArrayTable.create(
ImmutableList.of("1", "2", "3"), ImmutableList.of(0, 1, 2));
table.put("1", 0, "value1");
table.put("1", 1, "value2");
table.put("1", 2, "value3");
table.put("2", 0, "value11");
table.put("2", 1, "value22");
table.put("2", 2, "value33");
table.put("3", 0, "value111");
table.put("3", 1, "value222");
table.put("3", 2, "value333");
for (final Integer columnKey : table.columnKeyList()) {
System.out.println(table.column(columnKey).values());
}
// prints:
// [value1, value11, value111]
// [value2, value22, value222]
// [value3, value33, value333]
ja celowo wykorzystywane String na klucze wierszy, które są [1, 2, 3, ...] liczb całkowitych rzeczywistości (jak to zrobiłeś w pytaniu) i całkowitymi dla kolumn kluczy zaczynając od 0 ([0, 1, 2, ...]), aby pokazać podobieństwo do poprzedniego przykładu, korzystając z kolekcji List get(int)
dla kolekcji wartości multimap.
nadzieję, że będzie pomocny, głównie w celu ustalenia, co chcesz;)
PS: Używam tutaj ArrayTable
, ponieważ ma on lepszy sposób tworzenia ustalonego zestawu (wszechświata) wartości wierszy/kluczy niż ImmutableTable
, ale jeśli zmienność nie jest wymagana, powinieneś użyć jej zamiast jednej zmiany - ImmutableTable
(i dowolnej innej implementacji tabeli) nie ma metody columnKeyList()
, ale tylko columnKeySet()
, która robi to samo, ale jest wolniejsza dla ArrayTable
. I oczywiście należy użyć ImmutableTable.Builder
lub ImmutableTable.copyOf(Table)
.
Kolekcje "Hash *" nie zachowują zamówienia reklamowego. – SLaks
Wygląda na to, że potrzebuję użyć Tabeli, a nie MultiMap – KJW