当每行中的整数数量未知时,如何读取多行中的多个整数

时间:2015-07-05 07:31:15

标签: java java.util.scanner

编辑:这是输入: 第一个数字是m,后跟m个数字。下一个条目是n后跟n行,每行都有不同数量和未知数量的元素。

5

1 2 3 4 5

3

1 2 3 4 5 6

1 2 3 4 5

1 2 3 4

如何使用扫描仪类在Java中读取此输入? nextInt似乎没有将下一行字符考虑在内。 一种方法是将整行作为输入并从中获取整数,但我正在寻找更快的东西。

我的代码适用于以下约束: 1≤M≤10 1≤N≤100 n行中的元素数量范围在1到100之间

但超时以下(需要超过3秒): 1≤M≤100 1≤N≤9x 103 n行中的元素数量范围在1到1000之间

这是在做什么:

public static void main(String[] str) {
    Scanner in = new Scanner(System.in);

    ArrayList<Integer> qualities = new ArrayList<Integer>();
    int m = in.nextInt();
    in.nextLine();

    for(int i=0;i<m;i++)
        qualities.add(in.nextInt());

    int n = in.nextInt();
    in.nextLine();
    for(int j=0;j<n;j++) {
        HashSet<Integer> qua = new HashSet<Integer>();
        String[] strng = in.nextLine().split(" ");

        for(String x: strng)
            qua.add(Integer.parseInt(x));
            solve(qua);
    }
    System.out.print(count);
}

只是想知道是否有一种方法可以避免在读取具有多个整数的行时使用in.nextLine()而只是使用in.nextInt()。 每行中的整数数量各不相同,未知。

3 个答案:

答案 0 :(得分:1)

试试这个:

if (fulAvatar_BT.HasFile)
            {
                int count = 1;
                string fileName1 = Path.GetFileName(fulAvatar_BT.PostedFile.FileName);
                string fullPath = Server.MapPath(@"~/Resources/TinTucIMG/") + fileName1;

                string fileNameOnly = Path.GetFileNameWithoutExtension(fullPath);
                string extension = Path.GetExtension(fullPath);

                string newFullPath = fullPath;
                string path = Path.GetDirectoryName(fullPath);
                string fileName = "";

                while (File.Exists(newFullPath))
                {
                    string tempFileName = string.Format("{0}({1})", fileNameOnly, count++);
                    newFullPath = Path.Combine(path, tempFileName + extension);
                    fileName = tempFileName + extension;
                }

                fulAvatar_BT.PostedFile.SaveAs(Server.MapPath(@"~/Resources/TinTucIMG/" + fileName));
                linkAnhBia = @"~/Resources/TinTucIMG/" + fileName;
            }

                fulAvatar_BT.PostedFile.SaveAs(Server.MapPath(@"/Resources/TinTucIMG/" + fileName)); //error here ???
                linkAnhBia = "~/Resources/TinTucIMG/" + fileName;
            }

答案 1 :(得分:1)

  

如何使用扫描仪类在Java中读取此输入?

要检测Scanner的新行,您需要有两件事。

1)抓住第一行说L。

2)将L加入new Scanner并获取Int s。

类似的东西:

  Scanner scan=new Scanner(new File("input.txt"));  

        while(scan.hasNext())
       {
          String s=scan.nextLine();
          Scanner inscan=new Scanner(s);
             while(inscan.hasNext())
                  System.out.print(" "+inscan.nextInt());
          System.out.println("");
          inscan.close();

        }
         scan.close();

答案 2 :(得分:-1)

如果您使用的是扫描仪,除了使用扫描仪之外,您不需要做任何其他事情。此代码适用于字符串输入和系统输入的直接输入。正如您所看到的,它是Scanner的简单使用,唯一的变化是决定您想要实例化扫描器的方式,即选择String或System.input源。

    public static void main(String[] args)
    {
        System.out.println("\nInput some numbers (end by typing a non number)"); //$NON-NLS-1$
        String contents = 
                        "1 2 3 4 5\n" + 
                        "1 3 5 7 9\n" +
                        "5 4 3 2 1\n" +
                        "100 33 -146\n";

        // scanner form string
        Scanner sc = new Scanner(contents);
        // scanner from system input
//      Scanner sc = new Scanner(System.in);

        List<Integer> li = new LinkedList<>();

        while (true)
        {

            try
            {
                Integer i = sc.nextInt();
                li.add(new Integer(i));
            }
            catch(InputMismatchException e)
            {
                break;
            }
            catch(NoSuchElementException e)
            {
                break;
            }

        }

        Integer sum = 0;

        for (Integer i : li)
        {
            sum += i;
        }

        StringBuilder sb = new StringBuilder("sum = ").append(sum); //$NON-NLS-1$
        System.out.println(sb.toString());

        sc.close();
    }

使用链接到String或System输入的Scanner运行会产生相同的结果

42

由于使用空白规则,不需要对\ n进行特殊处理。

编辑: 使用System.input源时输入InputMismatchException异常,并输入非数字,如X.当源为String且输入用尽时,抛出NoSuchElementException异常。

这只是一个例子,你最好能够更好地处理生产代码的System.input结束。