Кажется, вы чрезмерно инженерны как-то.
Сначала я отвечу Stream
решением, просто для того, чтобы попробовать.
Обратите внимание, что я лично предпочел бы «старый» итеративный подход (см. Ниже).
// You can see by the use of AtomicInteger that this isn't the right road to take!
final AtomicInteger i = new AtomicInteger();
final Collection<List<String>> values1 =
mapOne.values()
.stream()
.flatMap(v -> v.stream())
.collect(partitioningBy(o -> i.getAndIncrement() % 2 != 0))
.values();
Выход: [[Robert, John, Tereza, James], [Redford, Travolta, May, Joyce]]
Итеративный подход
final Collection<String> names = new ArrayList<>();
final Collection<String> surnames = new ArrayList<>();
for (final List<String> value : mapOne.values()) {
names.add(value.get(0));
surnames.add(value.get(1));
}
Выход:
[Robert, John, Tereza, James]
[Redford, Travolta, May, Joyce]
Это безопасно, потому что вы знаете, что каждый внутренний List
имеет два элемента.
То, что Дж.Б. Низет говорит вам сделать (спасибо ему за то, что он написал это), в основном, заключается в создании соответствующего class
public class Person {
private String profession;
private String name;
private String surname;
// Getters and setters. JavaBean style
}
И приступить к сортировке Collection<Person>
.
Например, как можно проще
final List<Person> persons = new ArrayList<>();
// Populate list
Collections.sort(persons, (p1, p2) -> {
// Not null-safe
return p1.getName().compareTo(p2.getName());
});
Это отсортирует список по name
. Он не вернет новый список, а просто изменит входной.