while(sc.hasNextInt()) { int a = sc.nextInt(); // do something with a }的结构能不能改一下,改成我输入回车就会停止运行
时间: 2023-06-15 11:07:43 浏览: 88
可以使用类似下面的代码实现:
```
Scanner sc = new Scanner(System.in);
while(true) {
String input = sc.nextLine();
if (input.equals("")) break;
int a = Integer.parseInt(input);
// do something with a
}
```
这里使用 `nextLine()` 方法获取每一行的输入,然后判断该行是否为空,如果为空则退出循环,否则将该行转换成整数并进行处理。
相关问题
帮我看看下面代码有什么问题import java.util.*; import java.util.concurrent.LinkedTransferQueue; //线程类:计算整数序列和 class SumList extends Thread { private ArrayList lt=null;//存放整数序列的列表 SumList(ArrayList lt){ this.lt=lt; } //线程体 public void run() { int sum=0; for (int i = 0; i < lt.size(); i++) sum+=(int)lt.get(i); System.out.println(sum); } } //测试类 public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n=sc.nextInt();//输入序列个数 int m=sc.nextInt();//输入每个序列中的整数个数 for (int i = 0; i < n; i++) { ArrayList score=new ArrayList(); //创建求和列表对象 for (int j = 0; j < m; j++) { score.add(sc.nextInt()); } SumList sl=new SumList(score); Thread th=new Thread(sl);//创建线程对象 th.start(); //启动线程 } sc.close(); } }
这段代码可能存在一些问题,具体如下:
1. 在 SumList 类的构造函数中,为 ArrayList 类型的变量 lt 赋值时,应该使用深拷贝而不是浅拷贝。否则,在多个线程中同时对同一个列表进行操作的时候,可能会出现线程安全问题。
2. 在 SumList 类的 run() 方法中,使用了 ArrayList 类的 get() 方法获取列表中的元素,这个操作是线程不安全的。如果在多个线程中同时对同一个列表进行操作,可能会出现线程安全问题。
3. 在 Main 类的 for 循环中,创建了多个 SumList 类的对象,并且每个对象都被封装在了一个新的线程中。这样会导致创建大量线程,可能会导致系统资源浪费,降低程序的运行效率。
下面是修改后的代码:
import java.util.*;
import java.util.concurrent.LinkedTransferQueue;
//线程类:计算整数序列和
class SumList extends Thread {
private ArrayList<Integer> lt = null;//存放整数序列的列表
SumList(ArrayList<Integer> lt) {
// 使用深拷贝避免线程安全问题
this.lt = new ArrayList<Integer>(lt);
}
//线程体
public void run() {
int sum = 0;
synchronized(lt) {
for (int i = 0; i < lt.size(); i++) {
sum += lt.get(i);
}
}
System.out.println(sum);
}
}
//测试类
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();//输入序列个数
int m = sc.nextInt();//输入每个序列中的整数个数
ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();
for (int i = 0; i < n; i++) {
ArrayList<Integer> score = new ArrayList<Integer>(); //创建求和列表对象
for (int j = 0; j < m; j++) {
score.add(sc.nextInt());
}
lists.add(score);
}
// 只创建一个线程,依次处理每个列表
SumList sl = new SumList(new ArrayList<Integer>());
for (int i = 0; i < n; i++) {
sl.lt = lists.get(i);
Thread th = new Thread(sl); //创建线程对象
th.start(); //启动线程
}
sc.close();
}
}
import java.util.Scanner; class fenshu{ int a=1,b=2,x=3,y=4; public void jia(){ int zi; int mu; int last = 0; for (int i=1;i<=b*y;i++){ if (i%b==0&&i%y==0){ last=i; break; } } zi=(a*last/b)+(x*last/y); System.out.printf("("+zi+"/"+last+")"); } public void jian(){ int zi; int mu; int last = 0; for (int i=1;i<=b*y;i++){ if (i%b==0&&i%y==0){ last=i; break; } } zi=(a*last/b)-(x*last/y); System.out.printf("("+zi+"/"+last+")"); } public void cheng(){ int zi; int mu; int last = 0; zi=a*x; mu=b*y; for (int i=1;i<=zi+1;i++){ if (zi%i==0&&mu%i==0){ zi=zi/i; mu=mu/i; } } System.out.printf("("+zi+"/"+mu+")"); } public void chu(){ int zi; int mu; int last = 0; zi=a*y; mu=b*x; last=zi*mu; if (last<0){ last=-last; } for (int i=1;i<=last;i++){ if (zi%i==0&&mu%i==0){ zi=zi/i; mu=mu/i; } } System.out.println("("+zi+"/"+mu+")"); } } public class J { public static void main(String[] args) { int j; Scanner sc=new Scanner(System.in); while (sc.hasNextInt()) { fenshu a=new fenshu(); a.a=sc.nextInt(); a.b=sc.nextInt(); a.x=sc.nextInt(); a.y=sc.nextInt(); a.jia(); a.jian(); a.cheng(); a.chu(); } } }
这一个 Java 语言的实现,可以帮助您解决这个问题。代码中定义了一个名为 fenshu 的类,其中包含四个整数 a、b、x、y,分别表示两个分数的分子和分母。类中还定义了四个方法 jia、jian、cheng、chu,分别代表加、减、乘、除运算。在每个方法中,我们根据题目要求计算出结果,然后输出。最后,在 main 函数中,我们通过循环不断读入输入,直到没有输入为止,对于每组输入,创建一个 fenshu 类的对象,并调用各个方法进行运算。
不过需要注意的是,代码的缩进可能不太规范,建议在使用时调整一下缩进,以确保代码的可读性和可运行性。
阅读全文