例如,我有带对象的ArrayList。 这个对象有一些字段 - pictureName。 其中一个真的有图片名称(让我们把它们命名为“第一类”),其他只有一个空字符串(第二类)。
arrayList = M的大小,可以改变。 第一类和第二类物体的数量可以不同。
我需要获得相等或接近等量的第一类型对象和第二类型对象,并将它们添加到另一个(空)arraylist中。该arraylist的大小是N,并且N <= M。
更好的方法是什么?
UPD:我无法设置新ArrayList的大小。我只能找到这个号码(用户设置它)。但是N <= M总是如此
答案 0 :(得分:1)
OP澄清了他们的要求,所以我更新了我的代码。我仍然首先分成两个列表,如下所示,然后我按如下方式构建最终列表:
Iterator<MyObject> namesIterator = withNames.iterator();
Iterator<MyObject> noNamesIterator = noNames.iterator();
while (newList.size() < userDefinedSize) {
if (namesIterator.hasNext()) {
newList.add(namesIterator.next());
}
if (noNamesIterator.hasNext() && newList.size() < userDefinedSize) {
newList.add(noNamesIterator.next());
}
}
我的策略是迭代原始列表并根据对象是否有pictureName
来清空对象。然后创建一个新列表,并从我的桶中添加到该列表,直到我用完最小桶中的所有元素。
private void myMethod() {
List<MyObject> original = /* your code here */
List<MyObject> withNames = new ArrayList<>();
List<MyObject> noNames = new ArrayList<>();
for (MyObject o : original) {
if (o.pictureName != null) {
withNames.add(o);
}
else {
noNames.add(o);
}
}
int size = Math.min(withNames.size(), noNames.size());
List<MyObject> newList = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
newList.add(withNames.get(i));
newList.add(noNames.get(i));
}
// now you have the same number of named and unnamed objects in `newList`
}