如何将主类中的字符串存储到数组中,然后打印它-java

如何将主类中的字符串存储到数组中,然后打印它-java,java,arrays,Java,Arrays,这不是包含多个类的整个程序,它基本上是算法。我遇到的问题是无法打印出所有选项,如果我想先显示标题,则会出现java.lang.ArrayIndexOutOfBoundsException:0错误,如何计算选项数: public static void main(String[] args) { Menu menu=new Menu("Menu Title"); menu.display(); menu.addOption("Do 1");

这不是包含多个类的整个程序,它基本上是算法。我遇到的问题是无法打印出所有选项,如果我想先显示标题,则会出现java.lang.ArrayIndexOutOfBoundsException:0错误,如何计算选项数:

public static void main(String[] args)
{

        Menu menu=new Menu("Menu Title");

        menu.display();  

        menu.addOption("Do 1");
        menu.addOption("Do 2");
        menu.addOption("Do 3");
        menu.addOption("Do 4");

        menu.display();

        menu.addOption("Do 5");
        menu.addOption("Do 6");
        menu.addOption("Do 7");
        menu.addOption("Do 8");
        menu.addOption("Do 9");

        menu.display();       
}

public class Menu{
     int countOption;
     String options[];
     String menuTitle;

 public Menu(String menuTitle)
 {
    this.menuTitle = menuTitle;
 }       

 public void addOption(String addOption)      
 {   

    if (addOption != null)
    {
        countOption++;
        options=new String[countOption];
        options[countOption-1]=addOption;

    }   
 }

 public void display()   
 {
       System.out.println(menuTitle);
       int b;
       for (b = 0; b<countOption;b++)    
        System.out.println(options[b]);

  }

}
publicstaticvoidmain(字符串[]args)
{
菜单菜单=新菜单(“菜单标题”);
menu.display();
menu.addOption(“Do 1”);
menu.addOption(“Do 2”);
menu.addOption(“Do 3”);
menu.addOption(“Do 4”);
menu.display();
菜单。添加选项(“Do 5”);
菜单。添加选项(“Do 6”);
menu.addOption(“Do 7”);
menu.addOption(“do8”);
menu.addOption(“Do9”);
menu.display();
}
公共类菜单{
整数计数选项;
字符串选项[];
字符串菜单;
公共菜单(字符串菜单)
{
this.menuTitle=menuTitle;
}       
公共void addOption(字符串addOption)
{   
if(addOption!=null)
{
countOption++;
选项=新字符串[countOption];
选项[countOption-1]=addOption;
}   
}
公共空间显示()
{
System.out.println(menuTitle);
int b;

对于(b=0;b我同意这里的其他观点。我认为最好修改菜单类,使其利用ArrayList或List接口(提供)来保存菜单选项,这样它可以根据需要轻松动态增长,并且您可以使用大量的基本控件选项

我已经使用了您的菜单类并对其进行了修改,使菜单选项存储在字符串(
列表
)的列表界面中。我还向该类添加了两个构造函数,其中一个是空构造函数:

Menu menu = new Menu();
这允许声明一个菜单,但稍后可以使用任何您喜欢的方法初始化。另外,还可以提供另一个构造函数,该构造函数允许提供标题以及菜单选项的字符串数组或以逗号分隔的菜单选项字符串,例如:

String[] mOptions = {"Do 1", "Do 2", "Do 3"};
Menu menu = new Menu("My Title", mOptions);

                  OR

Menu menu = new Menu("My Title", "Do 1", "Do 2", "Do 3");
String[] newMO = {"New Option 1", "New Option 2"}
Menu menu = new Menu("My New Menu");
menu.addOption(newMO);
menu.display();
Menu menu = new Menu("\nMy NEW Menu Title :", "1) Do 1", "2) Do 2", "3) Do 3");
menu.display();

menu.changeOption(2, "3) What TO DO");
menu.display();
Menu newMenu = new Menu("\nMy NEW Menu Title :", "1) Do 1", "2) Do 2", "3) Do 3");
newMenu.display();
newMenu.insertOption(1, "2) What TO DO"); // Insert new option at index 1
newMenu.changeOption(2, "3) Do 2"); 
newMenu.changeOption(3, "4) Do 3");
newMenu.display();
newMenu.removeOption(1);

         OR

newMenu.removeOption("2) What TO DO");
List<String> theMenuOptions = newMenu.getOptions();
System.out.println(String.join(", ", theMenuOptions)); 
String[] newOptions = {"1) Play Sounds", "2) Continue Application", 
                       "3) Exit Application"};
newMenu.setOptions(newOptions); 
newMenu.display();
我还向菜单类添加了一些方法,如addTitle(),重载了addOption()方法以接受菜单选项的字符串数组,changeOption()insertOption()removeOption()getOptions(),以及setOptions()

addTitle()方法允许您提供或更改特定菜单实例的标题

addOption()方法已重载,因此现在可以将菜单选项的字符串数组添加到相关菜单实例中,例如:

String[] mOptions = {"Do 1", "Do 2", "Do 3"};
Menu menu = new Menu("My Title", mOptions);

                  OR

Menu menu = new Menu("My Title", "Do 1", "Do 2", "Do 3");
String[] newMO = {"New Option 1", "New Option 2"}
Menu menu = new Menu("My New Menu");
menu.addOption(newMO);
menu.display();
Menu menu = new Menu("\nMy NEW Menu Title :", "1) Do 1", "2) Do 2", "3) Do 3");
menu.display();

menu.changeOption(2, "3) What TO DO");
menu.display();
Menu newMenu = new Menu("\nMy NEW Menu Title :", "1) Do 1", "2) Do 2", "3) Do 3");
newMenu.display();
newMenu.insertOption(1, "2) What TO DO"); // Insert new option at index 1
newMenu.changeOption(2, "3) Do 2"); 
newMenu.changeOption(3, "4) Do 3");
newMenu.display();
newMenu.removeOption(1);

         OR

newMenu.removeOption("2) What TO DO");
List<String> theMenuOptions = newMenu.getOptions();
System.out.println(String.join(", ", theMenuOptions)); 
String[] newOptions = {"1) Play Sounds", "2) Continue Application", 
                       "3) Exit Application"};
newMenu.setOptions(newOptions); 
newMenu.display();
changeOption()方法允许您通过提供选项在菜单中的位置的索引值并提供将替换现有字符串的新选项字符串来更改(重命名或为空),例如:

String[] mOptions = {"Do 1", "Do 2", "Do 3"};
Menu menu = new Menu("My Title", mOptions);

                  OR

Menu menu = new Menu("My Title", "Do 1", "Do 2", "Do 3");
String[] newMO = {"New Option 1", "New Option 2"}
Menu menu = new Menu("My New Menu");
menu.addOption(newMO);
menu.display();
Menu menu = new Menu("\nMy NEW Menu Title :", "1) Do 1", "2) Do 2", "3) Do 3");
menu.display();

menu.changeOption(2, "3) What TO DO");
menu.display();
Menu newMenu = new Menu("\nMy NEW Menu Title :", "1) Do 1", "2) Do 2", "3) Do 3");
newMenu.display();
newMenu.insertOption(1, "2) What TO DO"); // Insert new option at index 1
newMenu.changeOption(2, "3) Do 2"); 
newMenu.changeOption(3, "4) Do 3");
newMenu.display();
newMenu.removeOption(1);

         OR

newMenu.removeOption("2) What TO DO");
List<String> theMenuOptions = newMenu.getOptions();
System.out.println(String.join(", ", theMenuOptions)); 
String[] newOptions = {"1) Play Sounds", "2) Continue Application", 
                       "3) Exit Application"};
newMenu.setOptions(newOptions); 
newMenu.display();
控制台窗口将显示:

My NEW Menu Title
1) Do 1
2) Do 2
3) Do 3

My NEW Menu Title
1) Do 1
2) Do 2
3) What TO DO
insertOption()方法允许您在相关菜单实例中的特定索引点插入单个菜单选项字符串,例如:

String[] mOptions = {"Do 1", "Do 2", "Do 3"};
Menu menu = new Menu("My Title", mOptions);

                  OR

Menu menu = new Menu("My Title", "Do 1", "Do 2", "Do 3");
String[] newMO = {"New Option 1", "New Option 2"}
Menu menu = new Menu("My New Menu");
menu.addOption(newMO);
menu.display();
Menu menu = new Menu("\nMy NEW Menu Title :", "1) Do 1", "2) Do 2", "3) Do 3");
menu.display();

menu.changeOption(2, "3) What TO DO");
menu.display();
Menu newMenu = new Menu("\nMy NEW Menu Title :", "1) Do 1", "2) Do 2", "3) Do 3");
newMenu.display();
newMenu.insertOption(1, "2) What TO DO"); // Insert new option at index 1
newMenu.changeOption(2, "3) Do 2"); 
newMenu.changeOption(3, "4) Do 3");
newMenu.display();
newMenu.removeOption(1);

         OR

newMenu.removeOption("2) What TO DO");
List<String> theMenuOptions = newMenu.getOptions();
System.out.println(String.join(", ", theMenuOptions)); 
String[] newOptions = {"1) Play Sounds", "2) Continue Application", 
                       "3) Exit Application"};
newMenu.setOptions(newOptions); 
newMenu.display();
以下是将在控制台中显示的内容:

My NEW Menu Title:
1) Do 1
2) Do 2
3) Do 3

My NEW Menu Title:
1) Do 1
2) What TO DO
3) Do 2
4) Do 3
removeOption()方法允许您从位于特定索引的特定菜单实例中删除特定菜单选项,例如:

String[] mOptions = {"Do 1", "Do 2", "Do 3"};
Menu menu = new Menu("My Title", mOptions);

                  OR

Menu menu = new Menu("My Title", "Do 1", "Do 2", "Do 3");
String[] newMO = {"New Option 1", "New Option 2"}
Menu menu = new Menu("My New Menu");
menu.addOption(newMO);
menu.display();
Menu menu = new Menu("\nMy NEW Menu Title :", "1) Do 1", "2) Do 2", "3) Do 3");
menu.display();

menu.changeOption(2, "3) What TO DO");
menu.display();
Menu newMenu = new Menu("\nMy NEW Menu Title :", "1) Do 1", "2) Do 2", "3) Do 3");
newMenu.display();
newMenu.insertOption(1, "2) What TO DO"); // Insert new option at index 1
newMenu.changeOption(2, "3) Do 2"); 
newMenu.changeOption(3, "4) Do 3");
newMenu.display();
newMenu.removeOption(1);

         OR

newMenu.removeOption("2) What TO DO");
List<String> theMenuOptions = newMenu.getOptions();
System.out.println(String.join(", ", theMenuOptions)); 
String[] newOptions = {"1) Play Sounds", "2) Continue Application", 
                       "3) Exit Application"};
newMenu.setOptions(newOptions); 
newMenu.display();
getOptions()方法允许您检索当前菜单实例的当前菜单选项列表,例如:

String[] mOptions = {"Do 1", "Do 2", "Do 3"};
Menu menu = new Menu("My Title", mOptions);

                  OR

Menu menu = new Menu("My Title", "Do 1", "Do 2", "Do 3");
String[] newMO = {"New Option 1", "New Option 2"}
Menu menu = new Menu("My New Menu");
menu.addOption(newMO);
menu.display();
Menu menu = new Menu("\nMy NEW Menu Title :", "1) Do 1", "2) Do 2", "3) Do 3");
menu.display();

menu.changeOption(2, "3) What TO DO");
menu.display();
Menu newMenu = new Menu("\nMy NEW Menu Title :", "1) Do 1", "2) Do 2", "3) Do 3");
newMenu.display();
newMenu.insertOption(1, "2) What TO DO"); // Insert new option at index 1
newMenu.changeOption(2, "3) Do 2"); 
newMenu.changeOption(3, "4) Do 3");
newMenu.display();
newMenu.removeOption(1);

         OR

newMenu.removeOption("2) What TO DO");
List<String> theMenuOptions = newMenu.getOptions();
System.out.println(String.join(", ", theMenuOptions)); 
String[] newOptions = {"1) Play Sounds", "2) Continue Application", 
                       "3) Exit Application"};
newMenu.setOptions(newOptions); 
newMenu.display();
以下是修改后的菜单类:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class Menu {
     List<String> options = new ArrayList<>();
     String menuTitle;
     String ls = System.lineSeparator();

    // Constructor 1 
    public Menu () {
        // Empty
    } 

    // Constructor 2
    public Menu (String menuTitle) {
        this.menuTitle = menuTitle;
    }

    // Constructor 3
    public Menu (String menuTitle, String... menuOptions) {
        this.menuTitle = menuTitle;
        this.options.addAll(Arrays.asList(menuOptions)); 
    }

    public void addTitle (String title) {
        this.menuTitle = title;
    }

    public void addOption(String menuOption) {   
        this.options.add(menuOption);
    }

    public void addOption(String[] menuOptions) {   
        this.options.addAll(Arrays.asList(menuOptions)); 
    }

    public void insertOption(int atIndex, String optionString) {   
        if (atIndex < 0 || atIndex > this.options.size()-1) {
            throw new IllegalArgumentException(
                    ls + ls+ "Menu.insertOption() Method Error!" + ls +
                    " The supplied Index (" + atIndex + ") is Out Of Bounds!");
        }
        this.options.add(atIndex, optionString);
    }

    public void changeOption(int atIndex, String newOption) {
        this.options.set(atIndex, newOption);
    }

    public void removeOption(int atIndex) {  
        if (atIndex < 0 || atIndex > options.size()-1) {
            throw new IllegalArgumentException(
                    ls + ls+ "Menu.removeOption() Method Error!" + ls +
                    " The supplied Index (" + atIndex + ") is Out Of Bounds!");
        }
        options.remove(atIndex);
    }

    public void removeOption(String optionString) {   
        options.remove(optionString);
    }

    public void display() {
        System.out.println(menuTitle);
        for (int b = 0; b < options.size(); b++) {   
            System.out.println(options.get(b));
        }
    }

    public List<String> getOptions() {
        return options;
    }

    public void setOptions(String[] menuOptions) {
        this.options.clear();
        this.options.addAll(Arrays.asList(menuOptions));
    }
}

将字符串存储到
列表中
选项
需要定义为类成员,级别与
b
相同,而不是作为
addOption
方法中的局部变量,其中1)当
addOption
完成执行时,其他人看不到它,2)它会消失。那么,好了。现在有两个问题。首先
options
需要初始化为空数组
String options[]=新字符串[0]第二,当您执行
options=new String[b+1];“在
addOption”中,您认为您已经添加到
options
中的任何内容会发生什么变化?“
Menu=new Menu()
和@ThumChoonTat已经说过:将选项存储在ArrayList中,就像这样:
List options=new ArrayList();
AddOption
会容易得多,
display
可以是一个lambda。是的,
ArrayList
会随着项目的添加而自动增长;对于数组,你不得不担心“增长”这是你自己的事(其实没那么难,还有一件事要学…)