【问题标题】:Filtering a string from arrayList in Java从Java中的arrayList过滤字符串
【发布时间】:2018-05-05 06:22:49
【问题描述】:

我有一个包含学生成绩的 ArrayList,我想用给定的成绩字母过滤学生。例如,如果用户输入 A,表格必须显示所有成绩为 F 的学生。但问题是它没有过滤它。

  static List<Assign2> studentList = new ArrayList<>();


    String letter = JOptionPane.showInputDialog(this,"Which grade do you want to filter?");

            List<Assign2> remaining = new ArrayList<>(studentList);
            for(int i=0;i<remaining.size();i++){
                if(remaining.get(i).getLetterGrade()!=letter){

                    remaining.remove(i);
                }
            }

            table(remaining);

【问题讨论】:

  • 你的字母等级格式是什么? String? char? 或者你确定成绩不都是A 的? ^^
  • 旁注:去掉 if 字母是“A”等,只检查循环中用户输入的值,否则你需要很多循环,每个字母一个。
  • 使用调试器在添加时实时查看值。
  • 另外,如果这是您的代码,那么 studentList 是空的。显然还有更多我们看不到的事情发生。
  • @JoachimHuet 字母等级必须为String 类型,因为char 没有contains() 方法

标签: java arraylist filtering


【解决方案1】:

此答案基于我对您的问题的理解。
试试这样。对于每个学生,您需要检查他是否没有输入的成绩单,如果有,请将他添加到列表中。

   String letter = JOptionPane.showInputDialog(this,"Which grade do you want to filter?"); 
                for(int i=0;i<studentList.size();i++){
                       if(!studentList.get(i).getLetterGrade().equalsIgnoreCase(letter)){
                        sList.add(studentList.get(i));
                    }
                }

【讨论】:

  • 它仍然提供未过滤的原始数组
【解决方案2】:

您可以使用以下 java8 sn-p 过滤掉所有不等于输入的成绩:

 // create copy
 List<Assign2> remaining = new ArrayList<>(studentList);

// remove all that do not have the input grade
remaining.removeIf(e -> !e.getLetterGrade().equals(letter));

上面的代码首先创建了一个原始列表的副本。然后使用该副本删除所有没有用户输入成绩的学生。

注意:原始列表仍然相同。所以它仍然包含所有学生

【讨论】:

  • 对不起我的错误,但它仍然给出了一个空表
  • @Ekin 您能否确认输入正确且经过验证?列表中有值吗?列表中的值是否正确?错误的情况可能有很多
  • 是的,我可以确认忘记了我之前的评论 eclipse 没有给出任何错误,但输出表是空的
  • 我做了一些修改,现在它显示了表格,但例如我想要 A 它给出 A 但有时它给出 C 或 D
  • @Ekin 你测试用户输入是否是大写的?长度为 1?对于存储在 studentList 对象中的字符串也是如此
【解决方案3】:

这样的事情怎么样:

if(letter.equalsIgnoreCase("A")){
    List<Strudents> sList = studentList.stream()
            .peek(s -> System.out.println(s.getLetterGrade())) // just for debugging purpose
            .filter(s -> s.getLetterGrade().contains("A")) // why not equals? Is it one letter only?
            .collect(Collectors.toList());
}

【讨论】:

    【解决方案4】:

    你可以做一些预先计算。就像您可以将所有成绩相同的学生分组并将它们放入 hashmap 中。当您收到查询时,只需从地图中获取学生列表即可。

    另一个不使用的选项

    studentList.get(i).getLetterGrade().contains("A")

    使用

    studentList.get(i).getLetterGrade().equalsIgnoreCase("A")

    【讨论】:

    • 它给了我这个,我不确定它是什么:Assign2[Vgfg,0,23,0x0,invalid,hidden,layout=java.awt.BorderLayout,title=,resizable,normal, defaultCloseOperation=HIDE_ON_CLOSE,rootPane=javax.swing.JRootPane[,0,0,0x0,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize =,preferredSize=],rootPaneCheckingEnabled=true]
    猜你喜欢
    • 2018-09-18
    • 2015-01-12
    • 2013-06-19
    • 1970-01-01
    • 2019-02-25
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    相关资源
    最近更新 更多