java - 失败的测试用例,我做错了什么?

标签 java arrays treemap

我一直在努力让它发挥作用,但我不太确定哪里出错了。稍后它会对测试用例有意义。关于我正在做的一些事情。该列表必须有一行或多行。如果没有至少一行,则抛出 IllegalArgumentException。每行都有某种字符串,然后是制表符,然后是 double 字符,然后是换行符。如果任何行不遵循此模式,那么也会抛出 IllegalArgumentException。如果您制作了任意数量的列表,这在理想情况下应该是有效的,所以这就是我以这种方式尝试的原因

基本上,该程序应该得到一个列表,比如...

California   6
Nevada      11
California   1
California  14
Arizona     21
Utah         2
California   7
Utah        10
Nevada       3
Utah         2

并且应该返回这样的东西:

California {6, 1, 14, 7} 
Arizona    {21}
Utah       {2, 10, 2}
Nevada     {11, 3}

请注意,为了示例起见,我只使用了四个。我正在尝试获取它,以便它可以与任意数量的列表一起使用。 这是我的代码...

 public static TreeMap<String, ArrayList<Double>> readTable (Scanner dataSource)
    {

        ArrayList<String> dataFromFile = new ArrayList<String>();

        while(dataSource.hasNext()){
            dataFromFile.add(dataSource.next());
       }

        //Populate TreeMap
        ArrayList<Double> statePopData = new ArrayList<>();
        TreeMap<String, ArrayList<Double>> map = new TreeMap<>();

        for (int i = 0; i < dataFromFile.size(); i++) {

            boolean isDouble;
            String state = "";


          try {
              Double.parseDouble(dataFromFile.get(i));
              isDouble = true;
          } catch (NumberFormatException | NullPointerException nfe) {
              isDouble = false;
          }


          if(isDouble) {
              statePopData.add(Double.parseDouble(dataFromFile.get(i)));
          } else { //means its a string

              statePopData.clear();
              state = dataFromFile.get(i);
          } 
          if (statePopData.isEmpty()) {
              map.put(state, statePopData);
          }

        } return map;
}

对于列表中所有其他状态的所有内容,我一直得到一个相同的值,我对为什么会这样感到困惑。

这是我之前提到的测试用例...

@Test
    public void testReadTable ()
    {
        try (Scanner scn = new Scanner(
                "Utah\t10\nNevada\t3\nUtah\t2\nCalifornia\t14\nArizona\t21\nUtah\t2\nCalifornia\t7\nCalifornia\t6\nNevada\t11\nCalifornia\t1\n"))
        {
            TreeMap<String, ArrayList<Double>> actual = GraphingMethods.readTable(scn);

            TreeMap<String, ArrayList<Double>> expected = new TreeMap<>();
            ArrayList<Double> azList = new ArrayList<>();
            azList.add(21.0);
            expected.put("Arizona", azList);

            ArrayList<Double> caList = new ArrayList<>();
            caList.add(6.0);
            caList.add(1.0);
            caList.add(14.0);
            caList.add(7.0);
            expected.put("California", caList); 

            ArrayList<Double> nvList = new ArrayList<>();
            nvList.add(11.0);
            nvList.add(3.0);
            expected.put("Nevada", nvList);     

            ArrayList<Double> utList = new ArrayList<>();
            utList.add(2.0);
            utList.add(10.0);
            utList.add(2.0);
            expected.put("Utah", utList);

            assertEquals(expected, actual);
        }
    }

我是一名新程序员,因此非常感谢任何建议!我很想知道我做错了什么,以便我可以学到更多。 :)

最佳答案

我认为主要问题是您正在为每个状态修改和插入相同的 ArrayList 实例。一个没有健壮性检查的简单版本可能是:

    TreeMap<String, ArrayList<Double>> map = new TreeMap<>();
    while (dataSource.hasNext()) {
        String state = dataSource.next();
        Double d = Double.parseDouble(dataSource.next());
        map.computeIfAbsent(state, k -> new ArrayList<>()).add(d);
    }
    return map;

computeIfAbsent 允许您在看到新状态时添加新的 ArrayList (Java 8+)。

另一个问题是 assertEquals。由于预期的数字列表数据的顺序与实际顺序不同,因此 ArrayLists 不相等。您可以像这样验证键和值:

    assertEquals(expected.keySet(), actual.keySet());
    expected.forEach((state, list) -> {
        Collections.sort(list);
        Collections.sort(actual.get(state));
        assertEquals(list, actual.get(state));
    });

关于java - 失败的测试用例,我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58195283/

相关文章:

php - MySQL - 1 个查询但返回两个数组?

Eclipse TreeMap 调试 View

java - 在java中多次将数组复制到另一个数组中

php - 检查多个值是否存在 php 数组

java - 序列化和反序列化变量删除

ios - withContentsofURL 可以声明超时限制吗?

java - 如何获取树形图中最高值元素的 id

java - 对于嵌套 TreeMap 的每个循环

java - Hibernate - JPA - OneToMany 和 CascadeType.ALL

java - 如果给定的查询参数无效或大小写不同,如何使 Spring MVC Controller 出错?