首页 > 解决方案 > 避免数组中的空值?

问题描述

我是一个新手编码器,我们在大学里的任务是只使用数组(我问老师并说没有数组列表或任何东西,想用粗略的方式来做)

它是关于创建一个数组,您可以在其中插入、搜索或删除一个值。我通过搜索和应用解决方案来了解其中的大部分内容。

但是他们想要一个输出,这样如果我删除 THEN 我搜索该值,它会显示该值已消失,但问题是因为该值已被删除 Java 会在其中放置一个 null ,所以当 for 循环循环遍历所有它创建可怕的 NullPointerException 错误的空值。我目前正在寻找具有这些限制的解决方案,但无济于事,而且我的 Java 词汇和术语目前确实很短:P

import static java.lang.System.out;
import java.util.Scanner;

public class JavaApplication 
{
    public static void main(String[] args) 
    {  
        Scanner kb = new Scanner(System.in);

        //initialize String array x20 
        String[] regName = new String[20];
        int regCount = 0;
        int func = 0;
        while (func == 0) //Main Menu Looper
        {    
            out.println("Select function by entering its number.");
            out.println("[1] Insert");
            out.println("[2] Search");
            out.println("[3] Delete");
            out.println("[4] Exit");
            out.print("Choose Operation: ");
            func = kb.nextInt(); //Choose Option
            out.print("======================================");
            out.print("\n");

            switch (func) 
            {    
                case 1: //Insertion
                         //set Array index start
                        char yesNo;
                    do 
                    {   
                        //Inserting into arrays loop
                        out.print("Insert student last name: ");
                        regName[regCount] = kb.next();
                        regCount++;
                        out.print("\n");

                        //Viewing loop
                        out.println("Student List: ");
                        for (int ctrl = 0; ctrl < regCount; ctrl++)
                        {
                        out.println(regName[ctrl]);
                        }
                        out.print("\n");

                        //Question loop
                        out.print("You want to insert again(Y/N):");
                        yesNo = kb.findWithinHorizon(".", 0).charAt(0);
                        if (yesNo == 'y' || yesNo == 'Y')
                        {
                            yesNo = 'y';
                        }   
                    } while (yesNo == 'y');
                func = 0;    
                break;   

                case 2: //Searching
                    out.print("Enter keyword: ");
                    String search = kb.next();
                    boolean found = false;
                    int searchCount = 0;
                    for (int ctrl = 0; ctrl < regCount; ctrl++) 
                    {
                        if (regName[ctrl].equalsIgnoreCase(search)) {
                        found = true;
                        out.println(search + " has " + " a match.");
                        }               
                        else
                        {
                        out.println(search + " has " + " not found.");
                        }    
                    }    
                    out.print("\n");
                    func = 0;
                break;  

                case 3: //Deleting
                    out.print("type surname you want to delete: ");
                    String toDelete = kb.next();
                    for (int ctrl = 0; ctrl < regCount; ctrl++) 
                    {
                        if (regName[ctrl].equalsIgnoreCase(toDelete)) {
                        regName[ctrl] = null;
                        out.println("Record deleted.");
                        }                
                    }    
                    out.print("\n");
                    func = 0;
                break;    

            } //switch
        } //while   
    } //main
} //class

标签: java

解决方案


其他答案建议检查空值。但这不会解决您的问题。由于您的代码的其余部分预计您的学生列表中没有空白。

在删除其中一些名称后尝试更改名称:

case 3: //Deleting
        out.print("type surname you want to delete: ");
        String toDelete = kb.next();
        int deleted = 0;
        for (int ctrl = 0; ctrl < regCount; ctrl++) {
            if (regName[ctrl].equalsIgnoreCase(toDelete)) {
                out.println("Record deleted.");
                deleted++;
            }
            if(deleted > 0) {
                int newCtrl = ctrl + deleted;
                regName[ctrl] = (newCtrl < regCount) ? regName[newCtrl] : null;
            }
        }
        regCount -= deleted;
        out.print("\n");
        func = 0;
    break;

此解决方案假定您的应用程序允许重复条目。

此外,我发现即使有匹配项,您的操作也会多次search打印。<Name> has not found尝试像这样更改它:

case 2: //Searching
        out.print("Enter keyword: ");
        String search = kb.next();
        boolean found = false;
        int searchCount = 0;
        for (int ctrl = 0; ctrl < regCount; ctrl++) {
            if (regName[ctrl].equalsIgnoreCase(search)) {
                found = true;
                out.println(search + " has a match : #" + ctrl);
                break;
            }
        }
        if(!found) {
            out.println(search + " has not found.");
        }
        out.print("\n");
        func = 0;
    break; 

更新:只删除第一次出现

case 3: //Deleting
        out.print("type surname you want to delete: ");
        String toDelete = kb.next();
        int deletedIndex = -1;
        for (int ctrl = 0; ctrl < regCount; ctrl++) {
            if(deletedIndex >= 0) {
                int newCtrl = ctrl + 1;
                regName[ctrl] = (newCtrl < regCount) ? regName[newCtrl] : null;
            } else if (regName[ctrl].equalsIgnoreCase(toDelete)) {
                deletedIndex = ctrl;
                out.println("Record deleted : #" + deletedIndex);
                regCount--;
            }
        }
        out.print("\n");
        func = 0;
    break;

推荐阅读