Неудачный тестовый пример, что я делаю не так? - PullRequest
2 голосов
/ 02 октября 2019

Я пытался заставить это работать, но я не совсем уверен, где я иду не так. Это будет иметь смысл с тестовым набором чуть позже. Несколько вещей о том, что я делаю. Список должен содержать одну или несколько строк. Если нет хотя бы одной строки, генерируется исключение 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(
                "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);
        }
    }

Я новый программист, поэтому любые советы будут с благодарностью! Я хотел бы знать, что я делаю неправильно, чтобы я мог узнать больше. :)

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Я думаю, что основная проблема в том, что вы модифицируете и вставляете один и тот же экземпляр 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));
    });
0 голосов
/ 02 октября 2019

Ваш код очищает statePopData каждый раз, когда появляется новая строка, поэтому, даже если вы видите:

California 1
California 2
California 3

Вы получите только карту с надписью California: 3, как map.put ()заменит текущее значение для ключа "California" на то, что вы ему предоставите.

Вам нужно будет вызывать текущую версию массива состояния каждый раз, когда вы видите это состояние, а затем добавлять новые данные в массивпрежде чем вставлять это.

...