我需要过滤元素,然后根据特定的列进行排序。张贴,我将需要找到唯一的条目,基于组合的列。由于它是文件处理,管道(X)被用作分隔符来表示列值。
String s1= "12|Thor|Asgaurd|1000000|Avenger|Active"
String s2= "234|Iron man|New York|9999999|Avenger|Active"
String s3= "420|Loki|Asgaurd|||Inactive"
String s4= "12|Thor|Asgaurd Bank|1000000|Avenger HQ|Active"数据首先需要根据活动/非活动状态进行过滤。然后,需要根据第四列对其进行排序。最后,需要通过合并列1、2、3来保持唯一性。
预期产出=
"234|Iron man|New York|9999999|Avenger|Active"
"12|Thor|Asgaurd|1000000|Avenger|Active"发布于 2019-05-31 15:01:58
首先,您应该创建一个表示字符串数据的对象。就像这样:
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);
}
}这样,您就可以从String创建一个对象流,然后创建到过滤器、排序和不同的操作:
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发布于 2019-05-31 14:47:45
创建模型类并解析字符串是可行的方法,但如果出于某些原因,您不想这样做,您可以这样做:
import java.util.Comparator;
import java.util.stream.Collectors;
import java.util.stream.Stream;
List<String> result = Stream.of(s1, s2, s3, s4)
.filter(s -> s.split("\\|")[5].equals("Active"))
.sorted(Comparator.comparing(e -> e.split("\\|")[4]))
.collect(Collectors.toList());发布于 2019-05-31 14:43:36
看起来,当一切都是字符串时,您似乎无法进行过滤。尝尝这个,
创建一个可以容纳列的新模型类。例如:
class MyData{
private String name;
private String city;
private String distance;
private String organization;
private String status;
//And create Getter Setter method for all above fields.
}现在来到您的主要课程,您可以在那里玩您的代码的东西。
Map<MyData> map = new HashMap<MyData>();
MyData myData = new MyData();
myData.setName("Thor");
myData.setCity("Asgaurd");
myData.setDistance("1000000");
myData.setOrganization("Avenger");
myData.setStatus("Active");
map.put(12, myData);
//Same thing for all other data (note: use the loop for data insertion in map)
Map<String, MyData> sorted = map.entrySet().stream().sorted(comparingByValue()).collect(toMap(e -> e.getKey(), e -> e.getValue().getName(), (e1, e2) -> e2,LinkedHashMap::new));
System.out.println("map after sorting by values: " + sorted);https://stackoverflow.com/questions/56396708
复制相似问题