【问题标题】:Filtering a list in Java and put the results in a new arraylist在 Java 中过滤列表并将结果放入新的数组列表中
【发布时间】:2014-08-17 09:43:17
【问题描述】:

我想过滤一个 CmisObjects 的数组列表,并将正确的对象(过滤器正确)放在另一个数组列表中。

我有 6 个字段需要检查,即 1 个文本输入、3 个选择框和 2 个日期输入。所以我想要与新数组列表中字段中的值匹配的对象。

我检查了 Stackoverflow 上的其他问题,其中一些问题相似,但我想知道是否有人通过一些示例代码有更清晰的答案。

提前致谢!

编辑 这是我现在拥有的一些代码,它只检查 2 个字段。

    String zoekterm = request.getParameter("zoekterm").toLowerCase();
    String zoektermselect = request.getParameter("zoektermselect");
    String startdatum = request.getParameter("startdatum");
    String einddatum = request.getParameter("einddatum");
    String status = request.getParameter("status");
    String type = request.getParameter("type");
    ArrayList<CmisObject> alleDossiers = (ArrayList<CmisObject>) request.getSession().getAttribute("alledossiers");
    ArrayList<CmisObject> filterlist = new ArrayList<CmisObject>();
    for (CmisObject dossier : alleDossiers) {
        String dossiernaam = dossier.getName().toLowerCase();
        String dossierexternepartij = ((String) dossier.getPropertyValue("oc:bedrijfsnaam")).toLowerCase();;
        String dossierstatus = ((String) dossier.getPropertyValue("oc:contractstatus"));
        String dossiertype = ((String) dossier.getPropertyValue("oc:contracttype"));
        if (zoektermselect.equals("Alle")) {
            if (dossiernaam.contains(zoekterm) || dossierexternepartij.contains(zoekterm)) {
                filterlist.add(dossier);
            }
        }
        if (zoektermselect.equals("Dossiernaam")) {
            if (dossiernaam.contains(zoekterm)) {
                filterlist.add(dossier);
            }
        }
        if (zoektermselect.equals("Externe partij")) {
            if (dossierexternepartij.contains(zoekterm)) {
                filterlist.add(dossier);
            }
        }
    }
    PrintWriter out = response.getWriter();
    out.println("<html><head></head><body>");
    int counter = 1;
    for (CmisObject dossier : filterlist) {
        out.println("<div id='noderef" + counter + "'>" + dossier.getId() + "</div>");
        out.println("<div id='dossiernaam" + counter + "'>" + dossier.getName() + "</div>");
        out.println("<div id='externepartij" + counter + "'>" + dossier.getPropertyValue("oc:bedrijfsnaam") + "</div>");
        out.println("<div id='contracttype" + counter + "'>" + dossier.getPropertyValue("oc:contracttype") + "</div>");
        counter++;
    }
    out.println("<div id='counter'>" + counter + "</div></body></html>");

【问题讨论】:

  • 你有代码吗?你试过什么
  • @TFischer 直到现在我才想到它是如何工作的,因为我知道的唯一方法是为每种可能性编写一个“if”

标签: java list arraylist filter


【解决方案1】:

如果我知道你在问什么,这似乎有点简单。如果所有 6 个参数都匹配,我猜你想将对象添加到 ArrayList&lt;CmisObjects&gt;?如果是这样,你想要这样的东西(伪代码):

ArrayList<CmisObject> toReturn = new ArrayList<CmisObject>(); 
for(int i = 0; i < yourArrayListOfCmisObjects.size(); i++){
    CmisObject obj = yourArrayListOfCmisObjects.get(i); 
    if(obj.getParam1() == param1 && obj.getParam2() == param2 && ... obj.getParam6() == param6){
       toReturn.add(obj); 
    }
}

然后你可以从那里操作 toReturn 。希望这会有所帮助!

===

编辑:您可以合并很多 if 语句,公平地说,您可以将它们分解为 boolean 表达式。

boolean bool1 = (zoektermselect.equals("Alle") && (dossiernaam.contains(zoekterm) || dossierexternepartij.contains(zoekterm)); 
boolean bool2 = (zoektermselect.equals("Dossiernaam") && dossiernaam.contains(zoekterm);
boolean bool3 = zoektermselect.equals("Externe partij") && dossierexternepartij.contains(zoekterm);
if(bool1 || bool2 || bool3){ 
    filterlist.add(dossier);
}

【讨论】:

  • 是的,我知道,但如果仅填写 3 个字段,它也必须工作
  • 是的,这会稍微清理一下代码。但是例如,如果“zoekterm”字段没有填写,但“status”选择字段设置为一个值,它仍然必须找到与“status”选择字段匹配的对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 2012-06-18
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
相关资源
最近更新 更多