Метод Удалить () в связанном списке для удаления наименьшего балла

#java #linked-list

Вопрос:

Я хочу, чтобы оценка GameEntry удаляла самый низкий балл после добавления в GameEntry, если с высоким баллом. Я установил максимальную запись 10. если больше 10, он должен удалить самый низкий балл и заменить индекс. я пытаюсь использовать метод remove() для отображения в main. Здесь я использую Один Связанный список. Пожалуйста, помогите просмотреть и оставить отзыв там, где я пропустил.Спасибо.

 
public class ScoresSingleLL {

private GameEntry head; //head node to hold the list

    //It Contains a static inner class Game Entry
    private static class GameEntry{
        private int score;
        private GameEntry next;
        
        public GameEntry(int score) {
            this.score = score;
            this.next = null;
        }
        
        public int getScore() {
        return score;
        }

    }
    
    private static final int highestScoregames = 10;
    private int totalAdded = 0;
    private GameEntry[] games = new GameEntry[highestScoregames];
    
    
    public void add(GameEntry game) {
        game.next = head;
        head = game;
        int score = game.getScore();
        if (totalAdded == highestScoregames) {
        if (score <= games[totalAdded - 1].getScore()) {
        return;
        }
        } else {
        totalAdded  ;
        }

        int i = totalAdded - 1;
        for (; (i >= 1) amp;amp;(score > games[i -1].getScore()); i--) {
        games[i] =games[i - 1];
        }
        games[i] = game;
        
        }
    
    public void remove(int i) throws IndexOutOfBoundsException {

        GameEntry game = head;
        games[i] = game;
        
        if ((i < 0) || (i >= totalAdded)) { //i is score where less than total added score
        throw new IndexOutOfBoundsException("Invalid index: "   i);
        }
                
        
        for (int j = i; j < totalAdded -1; j  ) {
        games[j] = games[j   1];
        }

        games[totalAdded - 1] = null;
        totalAdded--;
            
        }

    
    
        
    public void display() {

        GameEntry current = head;
        while(current != null){
            System.out.print("Game Entry [Score = "  current.score  "]"   "  ");
            current = current.next;             
        }
        System.out.println("null");
    }


    public static void main(String[] args) {
        
        
        
        GameEntry game1 = new GameEntry(1);
        GameEntry game2 = new GameEntry(2);
        GameEntry game3 = new GameEntry(3);
        GameEntry game4 = new GameEntry(4);
        GameEntry game5 = new GameEntry(5);
        GameEntry game6 = new GameEntry(6);
        GameEntry game7 = new GameEntry(7);
        GameEntry game8 = new GameEntry(8);
        GameEntry game9 = new GameEntry(9);
        GameEntry game10 = new GameEntry(10);
        GameEntry game11 = new GameEntry(11);
        
        ScoresSingleLL scores = new ScoresSingleLL();
        
        scores.add(game1);
        scores.add(game2);
        scores.add(game3);
        scores.add(game4);
        scores.add(game5);
        scores.add(game6);
        scores.add(game7);
        scores.add(game8);
        scores.add(game9);
        scores.add(game10); 
        
        scores.display();   
        scores.add(game11);
        scores.remove(0);
        scores.display();
        

    }

}

 

Комментарии:

1. Вы сохраняете список как в виде массива, так и в виде связанного списка. Почему?

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

3. ОК. Ниже приведены ответы. Не могли бы вы дать отзыв?

Ответ №1:

Ваш код поддерживает объекты в виде связанного списка и массива. Это уже перебор. В вашем коде есть несколько случаев, когда вы не синхронизируете их. Вам следует выбрать только одну из этих структур данных.

Поскольку ваш вопрос касается связанного списка, я предлагаю удалить массив. Вам это тоже не нужно totalAdded .

Вот исправленный код для этих двух функций. add Функция также гарантирует, что список не станет слишком длинным. Он удалит элемент(ы) в конце, когда это произойдет:

     private static final int highestScoregames = 10;
    
    public void add(GameEntry game) {
        if (highestScoregames == 0) { // Nothing allowed
             head = null;
             return;
        }
        if (head == null) {
            head = game;
            return;
        }
        int score = game.getScore();
        int count = 1;
        GameEntry current = head;
        if (score >= head.getScore()) {
            game.next = head;
            current = head = game;
        } else {
            while (current.next != null amp;amp; current.next.getScore() > score) {
                current = current.next;
                count  ;
            }
            // Insert game here
            game.next = current.next;
            current.next = game;
        }
        while (current.next != null amp;amp; count < highestScoregames) {
            current = current.next;
            count  ;
        }
        // Clip the rest of the list
        current.next = null;
    }
    
    public void remove(int i) throws IndexOutOfBoundsException {
        if (i < 0 || head == null) {
            throw new IndexOutOfBoundsException("Invalid index: "   i);
        } 
        if (i == 0) {
            head = head.next;
            return;
        }
        GameEntry game = head;
        for (int j = 1; j < i; j  ) {
            game = game.next;
            if (game == null || game.next == null) {
                throw new IndexOutOfBoundsException("Invalid index: "   i);
            }
        }
        // Remove game.next
        game.next = game.next.next;
    }
 

Комментарии:

1. Обратите внимание на небольшое исправление, которое я сделал сразу после того, как вы отметили ответ как принятый.

2. я вижу … отметил…я проверю это. Спасибо.

3. у меня есть мертвый код для этого: if (highestScoregames == 0) { // Ничего не разрешено head = null; возврат; }

4. Да, но он есть на случай, если вы когда-нибудь установите highestScoregames значение 0 в его объявлении. Если вы никогда не собираетесь этого делать, вы можете удалить эту часть кода.

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

Ответ №2:

Приведенный ниже код — Добавляет новые игровые элементы ближе к концу, пока общее количество записей не станет меньше 10. Удаляет GameEntry по заданному индексу. Как только общее количество игровых элементов достигнет 10, следующий добавляемый игровой элемент будет вставлен в существующий игровой элемент с минимальным счетом.

 public class ScoresSingleLL {
    private GameEntry head;
    private int size;

    private static class GameEntry {
        private int score;
        private GameEntry next;

        GameEntry(int score) {
            this.score = score;
        }

        @Override
        public String toString() {
            return "GameEntry{"  
                    "score="   score  
                    '}';
        }
    }

    /**
     * 1. Adds new GameEntry
     * 2. If size exceeds 10 then replace GameEntry with min score with the new GameEntry
     */
    public void add(GameEntry gameEntry) {
        if(size == 10) {

            // 1. Find the GameEntry with min score  and its index
            // 2. Call remove(index) to remove GameEntry at index from #1
            // 3. Call add(gameEntry, index) to replace a new GameEntry at index from #1
            GameEntry current = head;
            int min = current.score;
            int index = 0;
            for(int i = 1; i < size; i  ) {
                current = current.next;
                if(current.score < min) {
                    min = current.score;
                    index = i;
                }
            }

            remove(index);
            add(gameEntry, index);
            return;
        }

        // Adds new GameEntry by appending towards the end

        if(head == null) {
            head = gameEntry;
            head.next = null;

        } else {
            GameEntry current = head;
            while(current.next != null) {
                current = current.next;
            }
            current.next = gameEntry;
            gameEntry.next = null;
        }
        size  ;
    }

    /**
     Called only when removing GameEntry with min score and replace it with new GameEntry
     */
    private void add(GameEntry gameEntry, int index) {
        if(index < 0) {
            throw new UnsupportedOperationException("Index : "   index);
        }
        if(index == 0) {
            gameEntry.next = head;
            head = gameEntry;
            size  ;
            return;
        }

        GameEntry current = head;
        GameEntry previous = null;

        for(int i = 1; i <= index; i  ) {
            previous = current;
            current = current.next;
        }

        previous.next = gameEntry;
        gameEntry.next = current;
        size  ;
    }

    /**
     * Remove GameEntry at the given index
     */
    public void remove(int index) {
        if(size == 0 || index < 0 || index >= size) {
            throw new IndexOutOfBoundsException(""   index);
        }

        if(index == 0) {
            head = head.next;
            size--;
            return;
        }

        GameEntry current = head;
        GameEntry previous = null;

        for(int i = 1; i <= index; i  ) {
            previous = current;
            current = current.next;
        }
        previous.next = current.next;
        size--;
    }

    /**
     * Print all present GameEntry
     */
    public void display() {
        if(head == null) {
            System.out.println("No GameEntry Present");
            return;
        }

        GameEntry current = head;
        while(current != null) {
            System.out.println(current);
            current = current.next;
        }
    }

    public static void main(String[] args) {

        ScoresSingleLL scoresList = new ScoresSingleLL();
        System.out.println("n-------- GameEntry at the beginning --------");
        scoresList.display();

        System.out.println("n-------- Adding 10 GameEntry --------");
        scoresList.add(new GameEntry(1));
        scoresList.add(new GameEntry(2));
        scoresList.add(new GameEntry(3));
        scoresList.add(new GameEntry(3));
        scoresList.add(new GameEntry(4));
        scoresList.add(new GameEntry(6));
        scoresList.add(new GameEntry(7));
        scoresList.add(new GameEntry(8));
        scoresList.add(new GameEntry(9));
        scoresList.add(new GameEntry(-2));
        scoresList.display();

        System.out.println("n-------- Add GameEntry(10) in place of min score = -2 --------");
        scoresList.add(new GameEntry(10));
        scoresList.display();

        System.out.println("n-------- Add GameEntry(11) in place of min score = 1 --------");
        scoresList.add(new GameEntry(11));
        scoresList.display();

        System.out.println("n-------- Add GameEntry(13) in place of min score = 2 --------");
        scoresList.add(new GameEntry(13));
        scoresList.display();

        System.out.println("n-------- Add GameEntry(14) in place of 1st occurrence of min score = 3 --------");
        scoresList.add(new GameEntry(14)); // Add in place of 1st occurrence of min = 3
        scoresList.display();

        System.out.println("n-------- Add GameEntry(5) in place of min score = 3 --------");
        scoresList.add(new GameEntry(5)); // Add in place of min = 3
        scoresList.display();

        System.out.println("n-------- Remove GameEntry at 5th index i.e. score 6 --------");
        scoresList.remove(5); // Removes element at 5th index i.e. score 6
        scoresList.display();

        System.out.println("n-------- Add GameEntry(15) towards the end --------");
        scoresList.add(new GameEntry(15)); // Add new entry towards the end
        scoresList.display();

        System.out.println("n-------- Add GameEntry(16) in place of min score = 4 --------");
        scoresList.add(new GameEntry(16)); // Add in place of min = 4
        scoresList.display();

        System.out.println("n-------- Remove all GameEntry one by one --------");
        scoresList.remove(0);
        scoresList.remove(0);
        scoresList.remove(0);
        scoresList.remove(0);
        scoresList.remove(0);
        scoresList.remove(0);
        scoresList.remove(0);
        scoresList.remove(0);
        scoresList.remove(0);
        scoresList.remove(0);
        scoresList.display();
    }

}
 

Выход

 -------- GameEntry at the beginning --------
No GameEntry Present

-------- Adding 10 GameEntry --------
GameEntry{score=1}
GameEntry{score=2}
GameEntry{score=3}
GameEntry{score=3}
GameEntry{score=4}
GameEntry{score=6}
GameEntry{score=7}
GameEntry{score=8}
GameEntry{score=9}
GameEntry{score=-2}

-------- Add GameEntry(10) in place of min score = -2 --------
GameEntry{score=1}
GameEntry{score=2}
GameEntry{score=3}
GameEntry{score=3}
GameEntry{score=4}
GameEntry{score=6}
GameEntry{score=7}
GameEntry{score=8}
GameEntry{score=9}
GameEntry{score=10}

-------- Add GameEntry(11) in place of min score = 1 --------
GameEntry{score=11}
GameEntry{score=2}
GameEntry{score=3}
GameEntry{score=3}
GameEntry{score=4}
GameEntry{score=6}
GameEntry{score=7}
GameEntry{score=8}
GameEntry{score=9}
GameEntry{score=10}

-------- Add GameEntry(13) in place of min score = 2 --------
GameEntry{score=11}
GameEntry{score=13}
GameEntry{score=3}
GameEntry{score=3}
GameEntry{score=4}
GameEntry{score=6}
GameEntry{score=7}
GameEntry{score=8}
GameEntry{score=9}
GameEntry{score=10}

-------- Add GameEntry(14) in place of 1st occurrence of min score = 3 --------
GameEntry{score=11}
GameEntry{score=13}
GameEntry{score=14}
GameEntry{score=3}
GameEntry{score=4}
GameEntry{score=6}
GameEntry{score=7}
GameEntry{score=8}
GameEntry{score=9}
GameEntry{score=10}

-------- Add GameEntry(5) in place of min score = 3 --------
GameEntry{score=11}
GameEntry{score=13}
GameEntry{score=14}
GameEntry{score=5}
GameEntry{score=4}
GameEntry{score=6}
GameEntry{score=7}
GameEntry{score=8}
GameEntry{score=9}
GameEntry{score=10}

-------- Remove GameEntry at 5th index i.e. score 6 --------
GameEntry{score=11}
GameEntry{score=13}
GameEntry{score=14}
GameEntry{score=5}
GameEntry{score=4}
GameEntry{score=7}
GameEntry{score=8}
GameEntry{score=9}
GameEntry{score=10}

-------- Add GameEntry(15) towards the end --------
GameEntry{score=11}
GameEntry{score=13}
GameEntry{score=14}
GameEntry{score=5}
GameEntry{score=4}
GameEntry{score=7}
GameEntry{score=8}
GameEntry{score=9}
GameEntry{score=10}
GameEntry{score=15}

-------- Add GameEntry(16) in place of min score = 4 --------
GameEntry{score=11}
GameEntry{score=13}
GameEntry{score=14}
GameEntry{score=5}
GameEntry{score=16}
GameEntry{score=7}
GameEntry{score=8}
GameEntry{score=9}
GameEntry{score=10}
GameEntry{score=15}

-------- Remove all GameEntry one by one --------
No GameEntry Present