import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.Map.Entry;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
Map<Double, Integer> map = new HashMap<Double, Integer>();
while (scan.hasNext()) {
int i = 0;
int n = scan.nextInt();
while (i < n) {
double number = scan.nextDouble();
if (map.containsKey(number)) {
int value = map.get(number) + 1;
map.put(number, value);
} else {
map.put(number, 0);
}
i++;
}
}
Iterator<Entry<Double, Integer>> it=map.entrySet().iterator();
while(it.hasNext())
{
Entry<Double,Integer> entry=it.next();
if(entry.getValue()==3)
{
System.out.println(entry.getKey());
}
}
}
}
当在while (scan.hasNext())会阻塞不运行了。测试数据
10 1 9 30 2 7 10 94 64 82 13 9 4 9 5 23 65 34 2 10 21 8 10 97 47 38 82 91 2 71
正确结果是:2 10
也就是说开头10代表数组中有十个元素。 往后数十个,然后到9 就是这个数组有九个元素。 后面是8个。求这三个数组中相同的元素并按大小输出。
------解决思路----------------------
你创建Scanner对象时,采用的是System.in(标准输入流,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源),
当执行scan.hasNext()时,底层会检查该输入流中是否有数据可以读取。当发现没有数据可读取时(数据为空,或数据已全部读取完)。则会进入阻塞状态。
由于楼主你的代码用了while(scan.hasNext()),所以当你输入完数据按下回车后。会进行数据的解析读取操作。但当全部读取完成后,再次执行scan.hasNext()操作时。
就会检查到没有数据可以读取了。即会再次进入阻塞状态。
建议楼主数据处理操作转为以下方式,参考代码如下:
import java.util.Scanner;
/**
* @author zhuangqing
*/
public class Test {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
String[] datas = s.split("\\s+");
int i = 0;
while (i < datas.length) {
int len = Integer.parseInt(datas[i++]);
int temp = i;
while (i < len + temp) {
System.out.print(datas[i++] + " ");
}
System.out.println();
}
}
}
------解决思路----------------------
当然是IO阻塞了
------解决思路----------------------
另外,Scanner提供了很多hasNext的操作,如hasNextInt(),hasNextDouble()、hasNextLine()。这些操作中,除了hasNextLine()外,这些操作基本都是对hasNext()再做一层封装。其本质和hasNext()没区别。所以阻塞问题也是一样的。
------解决思路----------------------
scan是会阻塞的啥,等你输入,一直输入数据按回车,总会出来的