Прежде всего вы должны создать объект, который представляет ваши данные String. Примерно так:
public class MyObject {
private int id;
private String name;
private String location;
private Integer value;
private String category;
private String state;
public MyObject(String entry) {
String[] parts = entry.split("\\|");
if (parts.length != 6) {
throw new IllegalArgumentException("entry has not 6 parts");
}
id = Integer.parseInt(parts[0]);
name = parts[1];
location = parts[2];
try {
value = Integer.parseInt(parts[3]);
} catch (NumberFormatException ignored) {
}
category = parts[4];
state = parts[5];
}
// getters
@Override
public String toString() {
return String.join("|", String.valueOf(id), name, location, String.valueOf(value), category, state);
}
}
С этим вы можете создать поток объектов из ваших строк и фильтра, затем выполнить сортировку и различные операции:
Collection<MyObject> result = Stream.of(s1, s2, s3, s4)
.map(MyObject::new)
.filter(o -> "Active".equals(o.getState()))
.sorted(Comparator.comparing(MyObject::getValue).reversed())
.collect(Collectors.toMap(o -> Arrays.asList(o.getId(), o.getName()),
Function.identity(), (o1, o2) -> o1, LinkedHashMap::new))
.values();
result.forEach(System.out::println);
После операции карты вы фильтруете значения по состоянию и сортируете их по столбцу 4 (value
в моем случае). В конце вы собираете все значения в карте для отдельной операции. Добавьте все значения, для которых вы хотите различить, в Arrays.asList()
. В качестве значений карта принимает все исходные значения (Function.identity()
). Для дубликатов мы сохраняем первое значение ((o1, o2) -> o1
) и используем LinkedHashMap
для сохранения порядка элементов. В конце мы используем только значения карты.
Если вам нужен List
вместо Collection
, используйте new ArrayList(result)
.
Результат будет таким:
234|Iron man|New York|9999999|Avenger|Active
12|Thor|Asgaurd|1000000|Avenger|Active