Java:将数组列表拆分为块,其中对象具有相等的属性值

时间:2015-03-05 18:33:45

标签: java list split equals

我有一个ArrayList对象列表,比如Person

假设Person的布尔属性为'合格'。

我想得到一个索引对(i,j)的列表,这样list.sublist(i,j)的Persons具有相同的值。我不想修改列表。

在Java中有一种简单的方法吗?

由于

5 个答案:

答案 0 :(得分:1)

如果要选择eligible="false"作为列表的人员。在java 8中,您可以使用lambda表达式来过滤列表

List<Person> filteredresults = persons.stream()
    .filter(p -> p.getEligibilty()==false).collect(Collectors.toList());

答案 1 :(得分:0)

我不确定索引对的含义,但如果您只想要符合条件的索引列表,则可以使用for循环来测试每个元素的合格性。如果符合条件,请将该人员的索引添加到您的其他列表中。这不会修改您的原始列表。

for(int i = 0; i < personList.size(); i++) {
    if (personList.get(i).isEligible()) {
        otherList.add(i);
    }
}

如果符合条件是私有的,则必须编写一个只返回布尔值的isEligible()方法。

答案 2 :(得分:0)

您的问题没有直接的解决方案,没有内置的Java功能。但这可以帮助你。

    class Person {
        public boolean isEligible;
    }

    ArrayList<Person> persons;

    ArrayList<Pair<Integer,Integer>> retList = new ArrayList<>();
    int startIndex = -1;
    boolean currentSelection;

    for (int i = 0; i < persons.size(); i++) {
        if (startIndex < 0) {
            startIndex = i;
            currentSelection = persons.get(i).isEligible;

            continue;
        }

        if (currentSelection != persons.get(i).isEligible) {
            retList.add(new Pair<>(startIndex, i - 1));
            startIndex = i;
            currentSelection = persons.get(i).isEligible;

            continue;
        }
    }
    return retList;

答案 3 :(得分:0)

考虑一个持有变更指数的单位int[],而不是对的列表,因为您在truefalse之间切换。以下是使用此范例的经过测试的实现,并使用List.subList()生成子列表。

import java.util.*;

public class Main
{
    public static void main(String[] args) {
        List<Person> people =
            Arrays.asList(new Person(true), new Person(false),
                new Person(true), new Person(true), new Person(false),
                new Person(false), new Person(true));

        int[] changes = new int[people.size() + 1]; // allow for max changes
        Arrays.fill(changes, -1); // if an index is not used, will remain -1
        changes[0] = 0;
        int change = 1;
        boolean eligible = people.isEmpty() ? false : people.get(0).isEligible();
        for (int i = 1; i < people.size(); i++) {
            Person person = people.get(i);
            if (eligible != person.isEligible()) {
                changes[change++] = i;
                eligible = person.isEligible();
            }
        }
        changes[change] = people.size(); // end of last change segment

        List<List<Person>> sublists = new ArrayList<List<Person>>(change);
        for (int i = 0; i < change; i++) {
            sublists.add(people.subList(changes[i], changes[i + 1]));
        }
        System.out.println(sublists);
    }
}

请注意,不会复制people或其元素;子列表仅仅是对原始列表的查看。上面的代码假定Person类定义如下:

class Person
{
    boolean eligible;

    Person(boolean eligible) {
        this.eligible = eligible;
    }

    boolean isEligible() {
        return this.eligible;
    }

    @Override
    public String toString() {
        return "Person(" + isEligible() + ")";
    }
}

答案 4 :(得分:0)

您可以使用LambdaJ 轻松提取符合条件的人员列表。