【问题标题】:Filter objects inside an ArrayList as a result of multiple conditions in Processing (Java)由于处理(Java)中的多个条件,在 ArrayList 中过滤对象
【发布时间】:2016-01-02 10:50:53
【问题描述】:

我已经为此搜索了解决方案,但没有找到我真正需要的解决方案。

我想知道如何创建一个接受 可变 个条件的通用方法,并根据这些条件返回 ArrayList 的子集。比如:

ArrayList<Measure> dataFiltered = allData.filter(
  temperature: 20,
  humidity: <80,
  ...
);

我不知道如何在方法声明中检索这些条件,以及如何指向那​​些选定的变量来比较和创建过滤元素的子集:

public ArrayList<Measure> filter( /* ??? */ ) {
  ArrayList<Measures> filteredMeasures = new ArrayList();

  /* Manage conditions in here */

  for(Measure measure : allMeasures) {
    boolean allConditionsOK = true;
    for(condition : conditions) {
      // Point to specific variable set in conditions, and compare with value
      if(measure.[condition(variable)] != condition(value)) {
        allConditionsOK = false;
        break;
      }
    }
    if(allConditionsOK) filteredMeasures.add(measure);
  }
  return filteredMeasures;
}

【问题讨论】:

  • 类似public ArrayList&lt;Measure&gt; filter(Predicate... predicates) { ... } ? (见Predicate。)

标签: java class methods processing conditional-statements


【解决方案1】:

如果您使用的是 Java 8,请查看 Stream.filter() 方法的工作原理。

如果你不在 Java 8 上,还是看看它,因为它是一个很好的例子,它是定义一个接口(Java 8 使用 Predicate&lt;T&gt;),它有一个方法 boolean test(T t)

然后调用通过实现一个类来提供方法,例如一个匿名类:

ArrayList<Measure> dataFiltered = allData.filter(new Predicate<Measure>() {
    @Override
    public boolean test(Measure m) {
        return (m.getTemperature() == 20 &&
                m.getHumidity() < 80);
    }
});

或者 Java 8 中的 lambda 方式:

ArrayList<Measure> dataFiltered = allData.filter(m ->
    m.getTemperature() == 20 && m.getHumidity() < 80
);

那么过滤方法就很简单了:

public ArrayList<Measure> filter(Predicate<Measure> predicate) {
    ArrayList<Measures> filteredMeasures = new ArrayList();
    for (Measure measure : allMeasures)
        if (predicate.test(measure))
            filteredMeasures.add(measure);
    return filteredMeasures;
}

【讨论】:

  • 我需要更深入地了解它才能完全理解它。但是,您为我指明了正确的方向,谢谢。
  • 实现类的方法效果很好。但是,使用 lambda 表达式,编译器会返回错误意外标记:>
  • 据我所知Processing 3使用的是Java 8,但是这个功能可能不会应用。
  • 抱歉,刚刚注意到 lambda 有一个悬空的端括号。
  • 我在测试中改变了这个。我还尝试在语句中混合括号,参数中的括号......我只是想知道编译器错误是因为不支持的 lambda 表达式还是其他原因。
【解决方案2】:

你可以传递一个列表

public ArrayList<Measure> filter(List<Conditions> conditions ) {

varargs

public ArrayList<Measure> filter(Conditions... conditions ) {

但两者都将在您的循环中创建相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    相关资源
    最近更新 更多