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



我一直在努力让它工作,但我不太确定我哪里出错了。稍后测试用例将有意义。关于我正在做的事情的一些事情。列表必须包含一行或多行。如果没有至少一行,则会抛出 IllegalArgumentException。每行都有某种字符串,然后是制表符,然后是双精度,然后是换行符。如果任何行不遵循此模式,则也会抛出 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(
"Utaht10nNevadat3nUtaht2nCaliforniat14nArizonat21nUtaht2nCaliforniat7nCaliforniat6nNevadat11nCaliforniat1n"))
{
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允许您在看到新状态 (Java 8+( 时添加新ArrayList

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

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

每次有新字符串时,您的代码都会清除 statePopData,因此即使您看到:

California 1
California 2
California 3

你最终只会得到一张显示加利福尼亚:3的地图,因为map.put((将用您提供的任何内容替换键"加利福尼亚"的当前值。

每次看到状态时,都需要调用该状态数组的当前版本,然后在重新插入该状态之前将新数据追加到数组中。

最新更新