我有一个ArrayList对象列表,比如Person
假设Person的布尔属性为'合格'。
我想得到一个索引对(i,j)的列表,这样list.sublist(i,j)的Persons具有相同的值。我不想修改列表。
在Java中有一种简单的方法吗?
由于
答案 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[]
,而不是对的列表,因为您在true
和false
之间切换。以下是使用此范例的经过测试的实现,并使用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 轻松提取符合条件的人员列表。