Сталкиваюсь с некоторой головоломкой с моей программой (примечание: не могу использовать ArrayList)

#java #arrays

#java #массивы

Вопрос:

моя программа состоит из массива строк размером 25. Что я пытаюсь сделать, так это создать метод add, который добавляет элементы в этот массив Когда я пытаюсь добавить ту же строку, я создаю метод, который отображает количество раз, когда этот конкретный элемент указан в массиве String (для этого я использую хэш-карту). Программа работает не так, как планировалось. Кажется, что-то не так в моем методе add, потому что, когда я добавляю новый элемент, вместо увеличения до следующего индекса в массиве, он перезапускается с индексом 0 (что имеет смысл, поскольку каждый раз, когда вы вызываете метод add i = 0). Что я могу сделать, чтобы изменить этот метод для перехода к следующему индексу, если что-то добавлено? Спасибо, пожалуйста, смотрите код ниже:

 import java.util.*;

public class Assignment1 {




        public static void main(String[] args){
            new Assignment1 ();
        }

        // This will act as our program switchboard
        public Assignment1 (){
            Scanner input = new Scanner(System.in);
            String[] flowerPack = new String[25];
            int[] flowerCount = new int[25];
            System.out.println("Welcome to my flower pack interface.");
            System.out.println("Please select a number from the options below");
            System.out.println("");

            while(true){
                // Give the user a list of their options
                System.out.println("1: Add an item to the pack.");
                System.out.println("2: Remove an item from the pack.");
                System.out.println("3: Sort the contents of the pack.");
                System.out.println("4: Search for a flower.");
                System.out.println("5: Display the flowers in the pack.");
                System.out.println("0: Exit the flower pack interfact.");

                // Get the user input
                int userChoice = input.nextInt();

                switch(userChoice){
                    case 1: 
                        addFlower(flowerPack);
                        break;
                    case 2: 
                        removeFlower(flowerPack);
                        break;
                    case 3: 
                        sortFlowers(flowerPack);
                        break;
                    case 4: 
                        searchFlowers(flowerPack);
                        break;
                    case 5: 
                        displayFlowers(flowerPack);
                        break;
                    case 0: 
                        System.out.println("Thank you for using the flower pack interface. See you again soon!");
                        System.exit(0);
                }
            }

        }

        private void addFlower(String flowerPack[]) {
            // TODO: Add a flower that is specified by the user
            int i = 0;

            String flowerName;
            Scanner flowerInput = new Scanner(System.in);

            System.out.println("Please enter the name of a flower type to add:");
            flowerName = flowerInput.nextLine();
            flowerPack[i] = flowerName;
            i  ;

        }

        private void removeFlower(String flowerPack[]) {
            // TODO: Remove a flower that is specified by the user
            String flowerName;
            Scanner flowerInput = new Scanner(System.in);
            System.out.println("Please enter the name of a flower type to remove");
            flowerName = flowerInput.nextLine();

            for (int i = 0; i < flowerPack.length; i  ) {
                if (flowerPack[i].equals(flowerName)) {
                    flowerPack[i] = ""; //Will ask professor if we should set to NULL instead
                }
            }
        }

        private void sortFlowers(String flowerPack[]) {
            // TODO: Sort the flowers in the pack (No need to display them here) - Use Selection or Insertion sorts
            // NOTE: Special care is needed when dealing with strings! research the compareTo() method with strings

            Arrays.sort(flowerPack);
        }

        private void searchFlowers(String flowerPack[]) {
            // TODO: Search for a user specified flower
            String flowerType;
            Scanner flowerInput = new Scanner(System.in);
            System.out.println("Please enter the name of a flower to search for:");
            flowerType = flowerInput.nextLine();

            for (int i = 0; i < flowerPack.length; i  ) { //done in O(n) time This is a linear search
                if (flowerPack[i].equals(flowerType)) {
                    System.out.println("Found your flower "   flowerPack[i]);
                    break;
                } else {
                    System.out.println("Invalid flower type!");
                    break;
                }
            }
        }

        private void displayFlowers(String flowerPack[]) {
            // TODO: Display only the unique flowers along with a count of any duplicates
            /*
             * For example it should say
             * Roses - 7
             * Daffodils - 3
             * Violets - 5
             */

            Map<String,Integer> theFlowers = new HashMap<String, Integer>();

            for(int i=0;i<flowerPack.length;i  ){

                if(theFlowers.get(flowerPack[i])==null){
                    theFlowers.put(flowerPack[i],1);
                }else{
                    theFlowers.put(flowerPack[i], theFlowers.get(flowerPack[i]) 1);
                }
            }
            System.out.println(theFlowers);

        }



}
  

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

1. Пункт обзора кода: вам не нужно так много Scanner объектов. Вы могли бы просто использовать один экземпляр и поделиться им со всеми вашими методами, поскольку все они читают из System.in .

2. LOL правда, это немного избыточно. Спасибо за обзор кода.

Ответ №1:

Вы хотите добавить максимум 25 цветов, а затем остановиться, или вы хотите переопределить первую строку при добавлении 26-го цветка?

Если вы хотите добавить максимум 25 цветов, самым простым подходом было бы добавить новую строку в первую позицию с пустой строкой внутри массива. Что-то вроде

 flowerName = flowerInput.nextLine();
for(int i=0; i<flowerPack.length; i  ){
    if(flowerPack[i] == null || flowerPack[i].equalsIgnoreCase("")){
        flowerPack[i] = flowerName;
        break;
    }
}
  

Если вы хотите выполнить поворот в массиве (после добавления 25-го цветка вы перезаписываете первый элемент массива), вы должны запомнить следующий индекс, чтобы добавить flowername.
Индекс может быть переменной класса (но вы не должны называть его ‘i’, если хотите использовать переменную класса, поскольку ‘i’ часто используется в циклах)

Редактировать: Добавлен flowerPack [i] != null

(Код непроверен и, скорее всего, все еще содержит ошибки)

Правка 2: Добавлен разрыв, чтобы название цветка сохранялось только в одной позиции внутри массива.

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

1. Проблема, однако, в том, что я использую здесь структуру с переключением. Я хочу иметь возможность добавить элемент, затем вернуться к варианту переключения и сделать другой выбор, а также иметь возможность вернуться, чтобы добавить что-то еще снова. С циклом for он будет просто продолжать цикл, пока мы не дойдем до конечного элемента, верно?

2. @Linuxn00b Цикл for должен находиться внутри метода add, поэтому после его запуска вы возвращаетесь к своей структуре switch case. Также вы правы, что цикл продолжал повторяться, пока не достиг конечного элемента, и цикл перезаписывал каждую нулевую / пустую позицию в массиве (вместо только одной позиции) (я только что исправил это). Обычно цикл должен выполняться над каждым элементом в массиве, посмотрите, пуст ли элемент, и если он пуст, добавьте новый цветок. «Проблема» с этим кодом в том, что вы можете добавить только 25 цветов, и после этого вам придется удалить один, прежде чем добавлять новый

3. Спасибо, я попробую

Ответ №2:

Что касается вашей проблемы — внутри вашего addFlower(...) метода, который у вас есть int i = 0; , который создает новую локальную переменную каждый раз, когда вызывается метод, и устанавливает ее значение в 0. Другими словами, ваше i использование в этом методе бессмысленно, потому что переменная является локальной для метода и сбрасывается каждый раз, когда вы вызываете метод. Смотрите Этот учебник для получения подробной информации о переменных.

Я согласен с ответом «Мое имя» в том, что самым простым способом добавления элементов было бы найти первую позицию, которую вы считаете пустой / недопустимой, и поместить ваш новый элемент в эту позицию.

Помните, что если вы решите отслеживать текущее количество элементов в массиве, используя переменную-член класса, то вам захочется уменьшить эту переменную при удалении элементов.

Ответ №3:

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

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

1. У массивов нет метода .size (), у них есть . атрибут длины. Также arraylength установлен равным 25, поэтому flowerPack.length всегда будет возвращать 25.

2. Похоже, вы правы, поэтому без доступного метода .size() вам придется самостоятельно определять, сколько элементов используется в массиве. Одним из способов сделать это было бы иметь в вашем классе другую переменную, которая увеличивается каждый раз, когда вы добавляете элемент. Затем вы можете использовать свою переменную, чтобы узнать, каким будет следующий элемент.

3. Затем в вашем методе remove вы бы уменьшали переменную при удалении цветка из массива.