如何从ArrayList获得具有不同字段值的相等或接近等量的对象

时间:2017-07-20 17:16:33

标签: java android arraylist

例如,我有带对象的ArrayList。 这个对象有一些字段 - pictureName。 其中一个真的有图片名称(让我们把它们命名为“第一类”),其他只有一个空字符串(第二类)。

arrayList = M的大小,可以改变。 第一类和第二类物体的数量可以不同。

我需要获得相等或接近等量的第一类型对象和第二类型对象,并将它们添加到另一个(空)arraylist中。该arraylist的大小是N,并且N <= M。

更好的方法是什么?

UPD:我无法设置新ArrayList的大小。我只能找到这个号码(用户设置它)。但是N <= M总是如此

1 个答案:

答案 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`
}