1

我正在编写一个菜单以将名称存储到一个数组中,然后提供添加/删除学生以及搜索特定学生的选项,但我似乎无法找到如何设置数组以便我可以在其他中使用它选项,例如,我的代码只允许我在使用选项 1 时输入名称,但是当我选择选项 3 在数组中搜索名称时,它不会将这些名称保留在数组中,它只是显示为 null对于阵列中的每个插槽。

我遇到的另一个问题是关于如何删除学生,显然如果名字在数组的末尾会很容易,但是如果名字在中间怎么办,我怎么能删除名字,shift所有其他名称都放在一个插槽中,以便阵列中没有间隙?

import java.util.Scanner;

public class Lab10Ex2 {

    public static void main(String[] args) {
        int choice = 0;
        int[] stringArray = {};

        do{         

        String[] stringarray = new String[20];

            System.out.println("----------------MENU---------------");
            System.out.println();
            System.out.println("1. Add Students");
            System.out.println("2. Delete Students");
            System.out.println("3. Search for student");
            System.out.println("4. Print all Students");
            System.out.println("5. exit");

            Scanner scanchoice = new Scanner(System.in);
            choice = scanchoice.nextInt();

            if (choice ==1){

                    Scanner scannames = new Scanner(System.in);

                System.out.println("Please enter the student names into the array");

                int i = 0;

                for(i = 0; i<stringarray.length; i++){

                    String temp =scannames.nextLine();

                    stringarray[i]=temp.toLowerCase();

                    if(i==(stringarray.length-1)){
                        System.out.println("successfully filled up array fully");
                        System.out.println();
                    }
                }
            }

            if(choice==2){

            }

            if(choice==3){

                for(int p = 0; p<stringarray.length; p++){

                                    System.out.println(stringarray[p]);

                }
                                int x=0;
                                Scanner scannames1 = new Scanner(System.in);

                                System.out.println("Enter name of student you want to search for: ");
                                System.out.println();
                                String search=scannames1.nextLine();
                                String searchName=search.toLowerCase();

                                for(int p=0;p<20;p++){
                                    if(searchName.equals(stringarray[p])){
                                        x=1;

                                        }
                                    else{
                                        x=0;
                                    }
                                }

                                if(x==1){
                                    System.out.println("We have a match in our database for "+ searchName);
                                }
                                else if (x==0){
                                    System.out.println("No match for "+ searchName);
                                }
                            }

                            if (choice ==4){
                                System.out.println("List of names:");

                                for(int p = 0; p<stringarray.length; p++){
                                    System.out.println(stringarray[p]);
                                }
                            }
        }while(choice!=5);
    }
}
4

3 回答 3

2
    int choice = 0;
    int[] stringArray = {};

    do{         

        String[] stringarray = new String[20];

删除该int[] stringArray行(您不会在任何地方引用它)。

向上移动String[] stringarray,在循环外。

至于删除,您要么必须自己编写代码(将已删除项目的所有内容移到数组中的上一级),要么使用 Java 提供的集合类之一(而不是本机数组),它会为您处理删除。

于 2012-05-10T16:16:24.380 回答
1
do{         

    String[] stringarray = new String[20];

在 Do { ... } 循环的每次迭代中,您都在重新创建 stringarray 变量,从而将其清除。如果您将其移到循环之外,您的学生条目将被保留。

至于删除,如果您不需要使用字符串数组,我建议使用 ArrayList。它将允许您轻松删除特定条目,而无需担心其他条目。否则,是的,最简单的做法是将所有其他条目向下移动一个插槽以避免间隙

于 2012-05-10T16:19:16.127 回答
0

这是更正后的代码:

import java.util.Scanner;


public class Lab10Ex2 {

/**
 * @param args
 */
public static void main(String[] args) {
    int choice = 0;
    int[] stringArray = {};
    String[] stringarray = new String[20];

    do{         




        System.out.println("----------------MENU---------------");

        System.out.println();
        System.out.println("1. Add Students");
        System.out.println("2. Delete Students");
        System.out.println("3. Search for student");
        System.out.println("4. Print all Students");
        System.out.println("5. exit");



        Scanner scanchoice = new Scanner(System.in);
        choice = scanchoice.nextInt();

        if (choice ==1){

            Scanner scannames = new Scanner(System.in);

            System.out.println("Please enter the student names into the array");
            System.out.println();

            int i = 0;


            for(i = 0; i<stringarray.length; i++){



                String temp =scannames.nextLine();

                stringarray[i]=temp.toLowerCase();

                if(i==(stringarray.length-1)){
                    System.out.println("successfully filled up array fully");
                    System.out.println();
                }


            }







        }

        if(choice==2){


        }


        if(choice==3){


            for(int p = 0; p<stringarray.length; p++){

                System.out.println(stringarray[p]);

            }
            int x=0;
            Scanner scannames1 = new Scanner(System.in);

            System.out.println("Enter name of student you want to search for: ");
            System.out.println();
            String search=scannames1.nextLine();
            String searchName=search.toLowerCase();

            for(int p = 0; p < stringarray.length ;p++){
                if(searchName.equals(stringarray[p])){
                    x=1;
                    break;
                }
                else{
                    x=0;
                }
            }



            if(x==1){
                System.out.println("We have a match in our database for "+ searchName);
            }
            else if (x==0){
                System.out.println("No match for "+ searchName);
            }
        }





        if (choice ==4){
            System.out.println("List of names:");

            for(int p = 0; p<stringarray.length; p++){

                System.out.println(stringarray[p]);
                System.out.println();


            }

        }










    }while(choice!=5);

}

}

你做错的事情:

  1. 在 do while 循环中实例化数组。
  2. 如果在数组中找到搜索实体,则不会跳出循环。

如果要避免删除后在数组中浪费空间,请使用 ArrayList。如果你用简单的数组绑定到这个,你可以这样做:

将 null 放在您从中删除的索引处。创建一个与原始数组大小相同且所有 null 值的临时数组。将原始数组中的所有元素复制到临时数组中,但跳过为空的元素。将原始数组指向新数组。

并避免硬编码数组长度!

于 2012-05-10T16:34:01.733 回答