Как отсортировать каждую строку текстового файла по второму элементу в строке и заполнить его в ListView?

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

Вот как выглядит мой текстовый файл:

Utkarsh 2
Stephen 1
UT 11
George 3

И это то, что я делаю.

    @FXML
    private void initialize() {
        ObservableList<String> levels = FXCollections.observableArrayList ();
        String fileName = currGame.getName()+"_leaderboard.txt";
        try{
            Scanner input = new Scanner(new File(fileName));
            String[] parts;
            int  i = 0;
            while(input.hasNext()){
                String line = input.nextLine();
                parts = line.split("\\s+");
                //levels.add(line);
                namesArray[i] = parts[0];
                movesArray[i] = Integer.parseInt(parts[1]);

                System.out.println(namesArray[i] + " " + movesArray[i]);
                i++;
            }   

            input.close();
        } catch (FileNotFoundException e) {
            System.out.println("File not found");
        }

        Arrays.sort(movesArray);

        for(int j = movesArray.length; j > 0; j--) {
            levels.add(namesArray[j]+" "+ String.valueOf(movesArray[j]));
        }

        //System.out.println(levels);
        levelList.setItems(levels);
    }

Он отлично работает, если я не разделяю и не сортирую, просто добавляю строку в уровни и устанавливаю ее на levelList. Но когда я пытаюсь разделить и отсортировать, он вылетает с ошибкой:

Oct 21, 2018 6:30:16 PM javafx.fxml.FXMLLoader$ValueElement processValue
WARNING: Loading FXML document with JavaFX API of version 10.0.1 by JavaFX runtime of version 8.0.121
Oct 21, 2018 6:30:19 PM javafx.fxml.FXMLLoader$ValueElement processValue
WARNING: Loading FXML document with JavaFX API of version 10.0.1 by JavaFX runtime of version 8.0.121
Oct 21, 2018 6:30:20 PM javafx.fxml.FXMLLoader$ValueElement processValue
WARNING: Loading FXML document with JavaFX API of version 10.0.1 by JavaFX runtime of version 8.0.121
javafx.fxml.LoadException: 
/Users/utkarshatri/UNSW/sem2-18/project/group-Optimistic-Lovers/bin/package1/leaderboard.fxml

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2571)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
    at package1.LeaderboardShowScreen.start(LeaderboardShowScreen.java:40)
    at package1.LeaderboardController.handleLeaderboardButton(LeaderboardController.java:54)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Node.fireEvent(Node.java:8413)
    at javafx.scene.control.Button.fire(Button.java:185)
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:417)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416)
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
    at com.sun.glass.ui.View.notifyMouse(View.java:937)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2566)
    ... 59 more
Caused by: java.lang.NullPointerException
    at package1.LeaderboardShowController.initialize(LeaderboardShowController.java:46)
    ... 69 more

Где я ошибаюсь?

Какая строка в вашей функции здесь 46?

Mark 21.10.2018 09:34

@Mark namesArray [i] = части [0]; часть

Utkarsh Atri 21.10.2018 09:37

Добро пожаловать в StackOverflow. Создайте минимально возможный пример, который все еще показывает вашу проблему. В вашем случае, вероятно, не имеет значения, что вы читаете ввод из файла, поэтому вы должны показать нам версию без файла, для получения дополнительной информации см. Минимальный полный проверяемый пример

Micha Wiedenmann 21.10.2018 09:40

namesArray действительно определяется? Если это не так, он выбросит NullPointerException.

Mark 21.10.2018 09:41

@Mark да, namesArray определяется глобально private int [] moveArray; частный String [] namesArray;

Utkarsh Atri 21.10.2018 09:42

Как вы это определили?

Mark 21.10.2018 09:42

@Mark private int [] moveArray; частный String [] namesArray;

Utkarsh Atri 21.10.2018 09:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы никогда не инициализировали правильно movesArray и namesArray. Ваш код namesArray[i] = parts[0]; выдаст NullPointerException, если значение namesArray равно нулю. Основываясь на вашем комментарии, вы только объявили его как глобальную переменную с помощью private int[] movesArray; private String[] namesArray;.

Пример объявления массива:

int[] movesArray = new int[10] // 10 is the length of the array, as example

Вы можете использовать Списки, если не уверены, каким должен быть размер массива.

Объявить глобально:

List<String> namesList = new ArrayList<String>();

и в вашем коде:

namesList.add(parts[0]);

ааа, есть ли способ сделать это, не объявляя размер, так как размер текстового файла изменится

Utkarsh Atri 21.10.2018 09:46

Обновил ответ

Mark 21.10.2018 09:48

работает. Спасибо @Mark

Utkarsh Atri 21.10.2018 09:56

Другие вопросы по теме