使用Scanner类扫描int时出错

时间:2017-05-30 17:35:07

标签: java collections hashmap java.util.scanner

我有一项作业,其内容如下 - 读取2n个数字作为输入,其中第一个数字表示键,第二个数字表示值。这两个数字都是整数类型。

编写函数getAverageOfOdd以找出其键由奇数表示的所有值的平均值。假设平均值是一个int而不是十进制数。将平均值作为输出返回。在UserMainCode类中包含此函数。

在Class Main中,用于读取2n个数字并构建hashmap。调用UserMainCode中的静态方法。

import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;

public class MasteringHashmap

{
public static void main(String args[]) 
{
    String number;
    Scanner sc = new Scanner(System.in);
    int n=sc.nextInt();

    //get next 2n numbers i.e n key value pairs using getValues() function into a hashmap
    HashMap<Integer,Integer> map = getValues(n);
    int out = UserMainCode.getAverageOfOdd(map);
    System.out.println(out);
    //fill your code here

}
static HashMap<Integer,Integer> getValues(int n)
{
    Scanner sc = new Scanner(System.in);
    HashMap<Integer,Integer> hm = new HashMap<Integer,Integer>();
    for(int i=1;i<=n;i++)
    {
        int k = sc.nextInt();
        int v = sc.nextInt();
        hm.put(k, v);
    }
    return hm;
  }
}

class UserMainCode {

public static int getAverageOfOdd(HashMap<Integer,Integer>h1)
{

    //fill your code here
    Set<Integer> keys = h1.keySet();
    Iterator<Integer> it = keys.iterator();
    int key,count=0,sum=0;
    while(it.hasNext())
    {
        if((key=it.next())%2!=0)
        {
            count++;
            sum+=h1.get(key);
        }
    }
    return sum/count;
    //return 0;
   }
}

当我在笔记本电脑上运行此代码时,它运行正常,但不知何故,在线评判会回复以下错误

Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:907)
    at java.util.Scanner.next(Scanner.java:1530)
    at java.util.Scanner.nextInt(Scanner.java:2160)
    at java.util.Scanner.nextInt(Scanner.java:2119)
    at MasteringHashmap.main(MasteringHashmap.java:14)

可能是什么原因?

2 个答案:

答案 0 :(得分:1)

问题是您在Scanner上打开了两个System.in个实例,并且它们互相干扰。第一个扫描器可能会缓冲一些输入,第二个扫描器没有任何内容,导致它抛出异常。

您应该在Scanner中打开一个main并将其传递给getValues方法:

public static void main(String args[]) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();

    //get next 2n numbers i.e n key value pairs using getValues() function into a hashmap
    HashMap<Integer, Integer> map = getValues(n, sc);
    ...
}

static HashMap<Integer, Integer> getValues(int n, Scanner sc) {
    HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
    for (int i = 1; i <= n; i++) {
        int k = sc.nextInt();
        int v = sc.nextInt();
        hm.put(k, v);
    }
    return hm;
}

答案 1 :(得分:0)

NoSuchElementException由Enumeration的nextElement方法抛出,表示枚举中没有更多元素。

http://docs.oracle.com/javase/7/docs/api/java/util/NoSuchElementException.html

这个怎么样:

if(input.hasNextInt() )
 number1 = input.nextInt(); // if there is another number  
else 
 number1 = 0; 

关于SO的这个问题回答了你的问题。请参考:NoSuchElementException with Java.Util.Scanner