java - 避免数组中的空值?
问题描述
我是一个新手编码器,我们在大学里的任务是只使用数组(我问老师并说没有数组列表或任何东西,想用粗略的方式来做)
它是关于创建一个数组,您可以在其中插入、搜索或删除一个值。我通过搜索和应用解决方案来了解其中的大部分内容。
但是他们想要一个输出,这样如果我删除 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
解决方案
其他答案建议检查空值。但这不会解决您的问题。由于您的代码的其余部分预计您的学生列表中没有空白。
在删除其中一些名称后尝试更改名称:
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;
推荐阅读
- c - 如何解决没有找到铿锵声的stdio.h?
- java - 无法在 Andoird O (android 8.0) 中读取 OkHttp 中的响应
- python - 使用win32com按Outlook中的对话线程对邮件进行分类/分组?
- python - 使用 Django 和 manage.py 测试运行器时如何生成 Allure 报告文件?
- ios - 一旦坐标在 Firebase 中保存为字符串,如何在 CLLLoationDegrees 中获取它们来计算用户之间的距离?
- ios - xcode - webview 内容显示在状态栏中
- python-3.x - 递归反转列表python抛出错误
- omnet++ - 如何在 omnet++ 中记录应用程序 int 变量?
- pandas - 在特定列上添加来自其他数据框的列,同时保留原始索引
- python - 对返回“无”的两列应用操作