gpt4 book ai didi

java - 在 Java 中剪切列表

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:08:41 25 4
gpt4 key购买 nike

我创建了一个类 Data在 java 。这是这个简单帮助类的源代码:

class Data {

private Integer x;
private Integer y;

Data(Integer x, Integer y) {
this.x = x;
this.y = y;
}

protected Integer get_x() {
return x;
}

protected Integer get_y() {
return y;
}

}

之后我使用我的类(class) Data创造一些List<Data> container .我在 container 中添加元素在 add 的帮助下方法并对我的列表进行排序。最后我打印出输出:

for(Data data : container){
System.out.println("Print x: " + data.get_x() + ", Print y: " + data.get_y());
}

可能的输出可能是:

Print x: 1, Print y: 3
Print x: 1, Print y: 5
Print x: 1, Print y: 2
Print x: 1, Print y: 4
Print x: 1, Print y: 5
Print x: 1, Print y: 2
Print x: 1, Print y: 6
Print x: 1, Print y: 7
Print x: 2, Print y: 3
Print x: 2, Print y: 5
Print x: 2, Print y: 2
Print x: 2, Print y: 4
Print x: 2, Print y: 5
Print x: 2, Print y: 2
Print x: 2, Print y: 6
Print x: 2, Print y: 7
...

每个独特的长度x -part 可以是可变的,我也不需要知道 x 有多少个不同的值我有在我的名单上。现在我的问题是:是否可以创建另一个列表(或修改这个列表),它只有有限且固定数量的 top x列表中的值并删除另一个?例如,我只希望每个 x 值有 3 个值。输出应该是这样的:

Print x: 1, Print y: 3
Print x: 1, Print y: 5
Print x: 1, Print y: 2
Print x: 2, Print y: 3
Print x: 2, Print y: 5
Print x: 2, Print y: 2

最佳答案

一个解决方案是存储一个 List<Data>对于每个 x你在 Map<Integer, List<Data>> 中的值(value).

Map<Integer, List<Data>> map = new HashMap<>();
for (Data data : container) {
List<Data> value = map.get(data.get_x());
if (value == null) {
map.put(data.get_x(), new ArrayList<>(Arrays.asList(data)));
} else if (value.size() < 3) {
value.add(data);
}
}

在此代码中,我们遍历所有数据并检索当前 x 的当前列表数据。如果它为 null,则意味着当前没有值,因此我们添加一个仅包含当前数据的新列表(将 Arrays.asList 包装到一个新的 ArrayList 中,因为它返回一个固定大小的列表)。否则,如果列表中的元素少于 3 个,则我们添加当前元素。

这将只保留每个 x 的前 3 个元素值(value)。


使用 Java 8,这个循环可以稍微简化:

Map<Integer, List<Data>> map = new HashMap<>();
for (Data data : container) {
List<Data> list = map.computeIfAbsent(data.get_x(), k -> new ArrayList<Data>());
if (list.size() < 3) {
list.add(data);
}
}

如果你想要一个List在所有值中(而不是 Map ),有一种更简单的方法(使用 Java 8):保留 Map<Integer, Integer>映射每个 x值及其出现次数:

Map<Integer, Integer> map = new HashMap<>();
List<Data> filtered = new ArrayList<>();
for (Data data : container) {
int count = map.merge(data.get_x(), 1, Integer::sum);
if (count < 3) {
filtered.add(data);
}
}

filtered列表将有想要的结果。在这段代码中 map.merge如果没有映射则插入 1,否则将 1 添加到先前的映射。

关于java - 在 Java 中剪切列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34855967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com