在Java中通过多个变量过滤arraylist

时间:2015-11-30 05:59:06

标签: java arraylist

这是我项目的一部分,我找不到任何实现方法。

所以我有一个ArrayList学生班。这是班级:

public abstract class Student {
  protected int STT;
  protected int Nhom;
  protected int To;
  protected String HoLot;
  protected String Ten;
  protected String Lop;
  protected String Khoa;
}

我想过滤该列表并返回与该类的某个值匹配的另一个ArrayList保持元素。我的项目现在只能一次过滤一个属性。

Image 1

我所做的只是切换所选项目的索引(组合框)并检查列表中的所有元素。

但我真正想要的是用户可以选择他们想要过滤列表的许多变量,我们不知道他们选择了多少。

Image 2

请帮忙!

1 个答案:

答案 0 :(得分:0)

过滤本身并不太具有挑战性。只需创建一个帮助方法来为您进行过滤:

如果允许Java 8(并且你已经学会了它):

public static void filter(ArrayList<Student> lst, Predicate<Student> acceptStudent) {
    ArrayList<Student> lst2 = new ArrayList<>();
    for(Student s : lst) {
        if (acceptStudent.test(s)) {
            lst2.add(s);
        }
    }
    return lst2;
}

如果没有Java 8,它会变得更加冗长,但基本上是相同的

public static void filter(ArrayList<Student> lst, boolean testSST, int requiredSST, 
                          boolean testNhom, int requiredNHom, boolean testTo, 
                          int requiredTo, boolean testHoLot, String requiredHoLot,
                          boolean testTen, String requiredTen, boolean testLop,
                          String requiredLop, boolean testKhoa, String requiredKhoa) {
    ArrayList<Student> lst2 = new ArrayList<>();
    for(Student s : lst) {
        if ((!testSST || s.SST == requiredSST) && 
            (!testNHom || s.Nhom == requiredNHom) && 
            (!testTo || s.To == requiredTo) && 
            (!testHoLot || Objects.equals(s.NHom, requiredHoLot)) &&
            (!testTen || Objects.equals(s.Ten, requiredTen)) && 
            (!testLop || Objects.equals(s.Lop, requiredLop)) &&
            (!testKhoa || Objects.equals(s.Khoa, requiredKhoa))) {

            lst2.add(s);
        }
    }
    return lst2;
}

然后简单地将gui挂钩到过滤器方法,输入可接受的参数,然后离开你!