java - 我的代码中的嵌套开关有什么问题?

标签 java linked-list switch-statement

我想在下面的代码中创建 2 个链表 - 案例“F”和案例“S”创建 2 个链表。

 outer:while(true) {
 switch(in.next().charAt(0))
    {
    case 'F':
          switch(in.nextInt())  
          {
           case 1:
            ll.insertF(in.nextInt());
            break;
        case 2:
            ll.insertR(in.nextInt());
            break;
        case 3:
            try {
            ll.insertP(ll.head, in.nextInt());
            }
            catch(Exception e)
            {
                System.out.println("Cannot do");
            }
            break;
        case 4:
            ll.display();
            break;
        case 5:
            ll.deleteR();
            break;
        case 6:
            ll.reverse();
            break;
        case 7:
            ll.concat(l2.head);
            break;
        default:
            break;
        }
          break;
   case 'S':
        switch(in.nextInt())    
              {
               case 1:
                l2.insertF(in.nextInt());
                break;
            case 2:
                l2.insertR(in.nextInt());
                break;
            case 3:
                try {
                l2.insertP(l2.head, in.nextInt());
                }
                catch(Exception e)
                {
                    System.out.println("Cannot do");
                }
                break;
            case 4:
                l2.display();
                break;
            case 5:
                l2.deleteR();
                break;
            case 6:
                l2.reverse();
                break;
            case 7:
                l2.concat(ll.head);
                break;
            default:
                break;
            }
              break;
        default:
            System.out.println("Out");
            break outer;

    }
}

获取输出: F 4 空的 1 输出

转到外部开关的第一个情况“F”并选择情况 4 后,直接转到外部开关并转到外部开关的“默认”。但我不明白为什么在执行了内部开关“F”的第一种情况4后它会退出内部开关。

使用的函数有(如果需要的话):

    public void insertF(int d)
{
    Node temp= new Node(d);
    temp.next=head;
    head= temp;
}
public void insertR(int d)
{
    Node temp= new Node(d);
    if(head==null)
    {
        head=temp;
        return;
    }
    Node cur=head;
    while(cur.next!=null)
        cur=cur.next;
    cur.next=temp;
}
public void insertP(Node p,int d)
{
    if(p==null) {
        System.out.println("No");
        return;
    }
    Node temp= new Node(d);
    temp.next=p.next;
    p.next=temp;

}
public void deleteR()
{
    if(head==null)
    {
        System.out.println("Empty");
        return;
    }
    if(head.next==null)
    {
        head=null;
        return;
    }
    Node cur=head;
    Node prev=null;
    while(cur.next!=null)
    {
        prev=cur;
        cur=cur.next;
    }
    cur=null;
    prev.next=null;
}
public void reverse()
{
    if(head==null ||head.next==null)
    {
        return;
    }
    Node cur=head;
    Node temp=cur.next;
    cur.next=null;
    Node next;
    while(temp.next!=null)
    {
    next=temp.next;
    temp.next=cur;
    cur=temp;
    temp=next;
    }
    temp.next=cur;
    head= temp;
    System.out.println("Reversed");

}
public void concat(Node h2)
{
    if((head==null && h2==null)||(h2==null))
    {
        return;
    }
    else if(head==null)
    {
        head=h2;
    }
    else {
        Node cur=head;
        while(cur.next!=null)
        {
            cur=cur.next;
        }
        cur.next=h2;
    }

}
public void display()
{
    if(head==null)
    {
        System.out.println("Empty");
        return;
    }
    Node cur=head;
    while(cur!=null)
    {
        System.out.print(cur.data+" ");
        cur=cur.next;
    }
    System.out.println();
}

最佳答案

我认为问题在于您在“F”开关末尾有 break;,此处:

case 'F':
          switch(in.nextInt())  
          {
           case 1:
            ll.insertF(in.nextInt());
            break;
        case 2:
            ll.insertR(in.nextInt());
            break;
        //...
        default:
            break;
        }
          break; // here
case 'S':

但是,我强烈建议根据 OOP 原则重构代码,例如不要使用嵌套开关,而是执行以下操作:

case 'F':
          handleF(in.nextInt());
case 'S':
          handleS(in.nextInt());

你的代码很难读,甚至对你来说也是如此。

如果删除提到的 break; 没有帮助,那么首先考虑重构并提供更多代码,因此实际上可以为其他人编译和测试它 - 例如 Node 类和用户输入。

关于java - 我的代码中的嵌套开关有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60023652/

相关文章:

java - 我怎样才能从 if block 中出来?

java - Java 游戏的随机 Action AI Controller

java - 数组列表和链表的区别

c# - 将 'switch' 与资源文件中的字符串一起使用

php - 带 CASE/WHEN 或开关的父/子 MySQL 查询

java - 可以从 Tomcat Temp 文件夹中读取文件吗

java - 为什么当我强制转换时我无法访问子类属性?

c - 反向单链表

c++ - 从链接列表中删除零个连续的求和节点-此代码如何用于这样的测试用例?

javascript - 根据条件跳转到不同的 switch case,比如 goto