Сравнение списка Java, в результате которого я не могу определить - PullRequest
0 голосов
/ 06 ноября 2018

Я работаю над этим сценарием для последовательного сравнения элементов в списке / массиве в Java. По сути, код принимает CSV, преобразует его в список и выполняет итерации по размеру списка. Когда я пытаюсь сравнить значения, я сталкиваюсь с ошибкой, я не могу понять в этом случае:

Исключение в потоке "main" java.lang.ClassCastException: класс java.lang.String не может быть приведен к классу java.lang.Float (java.lang.String и java.lang.Float находятся в модуле java.base загрузчик 'bootstrap')
at list.main (list.java:22)

Код:

public class list{

    public static void main(String[] args){
        System.out.println("Enter your filename");
        Scanner inputValue = new Scanner(System.in);
        String fileLocation = inputValue.nextLine();
        try {
            String checkvalue = new String(Files.readAllBytes(Paths.get(fileLocation)));
            ArrayList<Float> listValues = new ArrayList(Arrays.asList(checkvalue.split("[\\r\\n]+")));
            System.out.println(listValues);
            for (int i = 0; i < listValues.size(); i++){
                System.out.println(listValues.get(i));
                float valueA = listValues.get(i);
                float valueB = listValues.get(i+1);
                if (valueA <= valueB){
                    System.out.println("True");
                }
            }
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Заменить эту строку

ArrayList<Float> listValues = new ArrayList(Arrays.asList(checkvalue.split("[\\r\\n]+")));

с этим:

ArrayList<Float> listValues = new ArrayList<>(
    Arrays.stream(
        checkvalue.split("[\\r\\n]+"))
            .map(Float::parseFloat).collect(Collectors.toList()
    )
);

У вас есть две основные ошибки

  • new ArrayList создает необработанный тип. И не следует использовать необработанные типы . Вот почему я добавил <>.
  • Arrays.asList(checkvalue.split("[\\r\\n]+")) создает List<String>, который не может быть преобразован в ArrayList<Float>. Вот почему я сопоставил все в String[] с Float::parseFloat.

Или, проще, как предложил маленький Луито,

ArrayList<Float> listValues = Arrays.stream(
        checkvalue.split("[\\r\\n]+"))
            .map(Float::parseFloat).collect(Collectors.toCollection(ArrayList::new));
0 голосов
/ 06 ноября 2018
 ArrayList<Float> listValues = new ArrayList(Arrays.asList(checkvalue.split("[\\r\\n]+")));

checkvalue.split(...) возвращает строковый массив. Таким образом, правая часть этого выражения создает ArrayList<String[]>. Вы объявили listValues как ArrayList<Float>, поэтому он пытается сообщить вам, что у вас есть несоответствие типов.

Чтобы решить, вам нужно разобрать строки в поплавки. Класс Java Float имеет хороший parseFloat метод, который вы можете использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...