避免在数组中使用null?

时间:2018-11-01 02:12:21

标签: java

我是新手编码员,在大学里,我们被赋予一项仅使用数组的任务 (我问老师,说没有数组列表或任何东西,都想用粗略的方法来做)

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

但是他们想要一个输出,以便如果我删除然后搜索该值,它将显示该值已消失,但是问题在于,由于删除了该值,Java在其中放置了null,所以当for循环循环时通过所有null都会创建可怕的NullPointerException错误。我目前正在搜索具有这些限制但无济于事的解决方案,而且我的Java词汇和术语目前很短:P

select publisher.uuid, Count(Book.uuid)
from Publisher
left join Book
    on Publisher.uuid = Book.publisher_id
group by Publisher.uuid

4 个答案:

答案 0 :(得分:1)

其他答案建议检查是否为空。但这无法解决您的问题。正如您的其余代码期望的那样,您的学生名单中不会有任何空白。

删除其中一些名称后,尝试转移名称:

import scala.collection.mutable

object StackReplace{
  implicit class StackListBuffer[T](listBuffer:mutable.ListBuffer[T]){
    def push(t:T):Unit = listBuffer.prepend(t)
  }
  implicit class StackList[T](list:List[T]){
    def push(t:T):List[T] = t +: list
  }
}
import StackReplace._
val a = mutable.ListBuffer(1,2,3)
a.prepend(0)
a           // ListBuffer(0, 1, 2, 3)

var b = List(1,2,3)
b = 0 +: b  // List(0, 1, 2, 3)

a.push(-1)
a           // ListBuffer(-1, 0, 1, 2, 3)
b.push(-1)  // List(-1, 0, 1, 2, 3)

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

我还发现,即使有匹配项,您的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; 

答案 1 :(得分:0)

只需执行空检查:if (regName[ctrl].equalsIgnoreCase(search)) {可以成为if (regname[ctrl] != null && regName[ctrl].equalsIgnoreCase(search)) {,依此类推。

这等效于:

if (regname[ctrl] != null)
{
    if (regName[ctrl].equalsIgnoreCase(search))
    {
        ...

由于Java评估表达式的方式,只有在第一部分没问题的情况下才完成第二部分-在您的情况下,只有在该索引的值不为null的情况下,才尝试使用数组。

如果要给老师留下深刻的印象,请中断插入搜索,然后将其删除以其他方法。

答案 2 :(得分:0)

搜索时,请在调用null之前先检查equalsIgnoreCase

if (regName[ctrl]!=null && regName[ctrl].equalsIgnoreCase(search)) {
    found = true;
    out.println(search + " has " + " a match.");
}               
else
{
    out.println(search + " has " + " not found.");
}  

答案 3 :(得分:0)

考虑到Null会在您使用任何数据结构进行编码时进行检查,以避免未检查的异常。因此,您可以先添加首先执行的检查,如果为true,则仅继续执行。

if (regname[ctrl] != null && regName[ctrl].equalsIgnoreCase(search)) {

希望这可以帮助您解决问题!