切换语句在for循环

时间:2017-03-30 03:16:23

标签: java for-loop switch-statement

所以我正在做一个HackerRank问题,因为某种原因似乎无法通过所有测试。我的代码通过了第一次运行但似乎没有通过所有其他测试。通过调试,似乎一旦使用了所有开关盒,for循环就会终止。

此练习是Java List问题。输入如

5
12 0 1 78 12
2
Insert
5 23
Delete
0

第一行包含一个整数N(列表中的初始元素数,在本例中为5)。 第二行包含组成列表的N个以空格分隔的整数。 第三行包含一个整数q(查询数)。 后续行描述了查询,每个查询分为两行:

如果查询的第一行包含字符串插入,则第二行包含两个以空格分隔的整数,并且该值必须插入到索引处。    如果查询的第一行包含字符串删除,则第二行包含index,其元素必须从中删除。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;


public class ListSolution {
public static void main(String[] args){
    List<Integer> list1 = new ArrayList<>();
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    sc.nextLine();
    for(int i =0;i<n;i++){
        list1.add(sc.nextInt());
    }

    sc.nextLine();
    int q = sc.nextInt();
    sc.nextLine();
    for(int i=0;i<q;i++){
        switch(sc.nextLine()){
        case "Insert" :
            int x = sc.nextInt();
            int y = sc.nextInt();
            sc.nextLine();
            list1.add(x,y);             
            continue;
        case "Delete" :
            int z = sc.nextInt();
            list1.remove(z);
            continue;
        default:
            continue;
        }
    }
    for(int i=0;i<list1.size(); i++){
        System.out.print(list1.get(i)+" ");;
    }
}
}

我能够完成问题并传递此特定输入。但是,它失败了所有其他3个查询,其中Insert和Delete是前两个。似乎一旦开关经历了所有情况,它就会终止for循环,即使有更多的迭代要完成。这种输入的一个例子是:

10
100 50 20 10 70 80 200 259 1 900
3
Insert
2 80
Delete
6
Insert
5 89

2 个答案:

答案 0 :(得分:1)

在switch的情况下,使用sc.next()而不是sc.nextLine()。最后,从插入案例中删除sc.nextLine()。

答案 1 :(得分:0)

这是一个有效的解决方案:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class ListSolution {
    public static void main(String[] args){
        List<Integer> list1 = new ArrayList<>();
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine();
        for(int i =0;i<n;i++){
            list1.add(sc.nextInt());
        }

        sc.nextLine();
        int q = sc.nextInt();
        sc.nextLine();
        for(int i=0;i<=q;i++){
            String input = sc.nextLine();
            switch(input) {
                case "Insert" :
                    int x = sc.nextInt();
                    int y = sc.nextInt();
                    sc.nextLine();
                    list1.add(x,y);
                    continue;
                case "Delete" :
                    int z = sc.nextInt();
                    list1.remove(z);
                    sc.nextLine();
                    continue;
                default:
                    continue;
            }
        }
        for(int i=0;i<list1.size(); i++){
            System.out.print(list1.get(i)+" ");;
        }
    }
}

你忘记的主要事情是删除后你没有要求获得新的一行。所以在你的第二个例子中,开关是一个空行返回,因此你得到的值是错误的。

如果我正在做这个练习,我会将每一行作为一个字符串,然后解析它。例如。获得整数:

String[] numbers = sc.nextLine().split(" ");
for(String number: numbers){
    list1.add(Integer.valueOf(number));
}

这样你就没有奇怪的行混淆。