你如何倒回或回到for循环的开始?
我尝试在这样的else语句中使用“x = 0”:
outerloop:
for(int x=0; x<arr.length; x++){
if(counter == countnum){
if(arr[x]!=0){
temp1 = Integer.toString(arr[x]);
death = death + " " + temp1;
arr[x] = 0;
counter=1;
}
}
else{
counter++;
}
if(x==(arr.length-1)){
for(int y=0; y<arr.length; y++){
if(arr[y]!=0){
x=0;
}
else
break outerloop;
}
}
}
它不起作用。我发现了迭代器,但我认为它没有用,相反,我不明白它是如何工作的。
这是一个更新,因为似乎没有人理解我的情况:
这就是我想要发生的事情:
输入:1 2 3 4
输入序列为2,然后输出应重新排列:2 4 3 1 相应于输入序列。所以我试图将for循环计数返回到0,但它只显示:2 4.它不返回x = 0,其中arr [x(即= 0)]。那是我的问题。
如果您愿意,这是我的完整源代码:
import java.util.Random;
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTextArea;
public class Josephus extends JFrame {
JLabel title;
JLabel men;
JLabel count;
JTextField mentext;
JTextField countext;
JTextArea display;
JButton execute;
JButton close;
String menstring;
String countstring;
int menum;
int countnum;
Random rand = new Random();
String generation = "Generated Men: ";
String death = "Death Series: ";
int counter = 1;
public Josephus(){
super("");
setLayout(null);
title = new JLabel("Death Execution");
title.setFont(new Font("Calibre", Font.BOLD, 20));
title.setBounds(350, 15, 400, 25);
add(title);
men = new JLabel("Number of Men");
men.setBounds(10, 60, 400, 25);
add(men);
mentext = new JTextField();
mentext.setBounds(120, 60, 150, 25);
add(mentext);
count = new JLabel("Count of Death");
count.setBounds(10, 100, 400, 25);
add(count);
countext = new JTextField(10);
countext.setBounds(120, 100, 150, 25);
add(countext);
display = new JTextArea(5, 20);
display.setEditable(false);
display.setBounds(290, 60, 280, 200);
add(display);
execute = new JButton("Execute");
execute.setBounds(105, 230, 80, 30);
add(execute);
execute.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String temp;
String temp1;
menstring = mentext.getText();
countstring = countext.getText();
menum = Integer.parseInt(menstring);
countnum = Integer.parseInt(countstring);
int arr[] = new int[menum];
for(int x=0; x<arr.length; x++){
if(x!=0){
if(arr[x]!=arr[x-1])
arr[x] = rand.nextInt(500)+1;
else
x--;
}
else
arr[x] = rand.nextInt(500)+1;
}
for(int x=0; x<arr.length; x++){
temp = Integer.toString(arr[x]);
generation = generation + " " + temp;
}
outerloop:
for(int x=0; x<arr.length; x++){
if(counter == countnum){
if(arr[x]!=0){
temp1 = Integer.toString(arr[x]);
death = death + " " + temp1;
arr[x] = 0;
counter=1;
}
}
else{
counter++;
}
if(x==(arr.length-1)){
for(int y=0; y<arr.length; y++){
if(arr[y]!=0){
x=0;
}
else
break outerloop;
}
}
}
display.setText(generation + "\n" + death);
}
});
close = new JButton("Close");
close.setBounds(200, 230, 70, 30);
add(close);
close.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit(0);
}
});
}
public static void main(String[] args){
Josephus frame = new Josephus();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setSize(600, 330);
frame.setVisible(true);
}
这是约瑟夫执行计划......
编辑:
我找到了解决方案。
答案 0 :(得分:4)
for
循环
for(int x=0; x<arr.length; x++)
在开头初始化x=0
。 (它的第一个表达式。)在每次执行循环体之前,它会测试x<arr.length
。 (它的第二个表达式。)在循环体之后但在下一个测试之前它执行x++
。 (第三个表达。)
所以x++
的{{1}}发生在循环中的所有代码之后。然后重新进行测试。当您回到循环顶部的测试时,您希望for(int x=0; x<arr.length; x++)
为x
。但是0
if
时arr[y]!=0
x
设置为0
,然后for循环中的x++
设为1
之前重做测试。
所以你需要设置x=-1
。然后,在重试测试之前,for循环中的x++
使其成为0
。然后使用x
0
重新完成测试。
PS(用谷歌搜索你没有解释的内容。)(虽然你的代码似乎想要执行到没有幸存者,所以我会假设。)
顶部if
“执行”x
的{{1}}元素,如果它是arr
非零countnum
元素,则将其设置为零模数arr
的最后一个。如果底部arr.length
将if
包裹回x
-1
(每个上面),则arr.length-1
时第三个语句可以break
为主循环全是零。或者,如果底部arr
将if
包裹x
通过arr
内的x=y-1
返回到for(int y=0; y<arr.length; y++)
的第一个非零元素,那么之后您可能会从主x==arr.length-1
中断 location /hls {
# Serve HLS fragments
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp;
add_header Cache-Control no-cache;
}
时循环。但遗憾的是,只要找到零元素,当前代码就会从循环中退出主循环,该循环会查找下一个非零元素。
答案 1 :(得分:1)
重启循环时最好不要乱砍。
int totalTimesRun = 0;
MAIN_LOOP:
while(true){
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
System.out.println(i + ", " + j);
if(j == i && i == 1 && ++totalTimesRun < 3) {
System.out.println("Restarting Loop");
continue MAIN_LOOP;
}
}
}
break; //will always break out of MAIN_LOOP
//unless continue MAIN_LOOP is called
}
输出
0, 0
0, 1
0, 2
1, 0
1, 1
Restarting Loop
0, 0
0, 1
0, 2
1, 0
1, 1
Restarting Loop
0, 0
0, 1
0, 2
1, 0
1, 1
1, 2 //since totalTimesRun is now 3 it runs
2, 0
2, 1
2, 2
这里的诀窍是
while(true){
//will only run once since break is at the end
break;
}
答案 2 :(得分:0)
通过更改计数器的值(在您的情况下为x)来重绕循环应该有效。
我怀疑问题在于你的内循环:
if(x==(arr.length-1)){
for(int y=0; y<arr.length; y++){
if(arr[y]!=0){
x=0;
}
else
break outerloop;
}
}
如果x
,您只能回放arr[0]!=0
。否则你就会脱离循环。即使你倒带x
,如果arr[y]==0
为y,你仍然可能会从循环中断开。
您可以使用以下代码替换该代码:
if(x==(arr.length-1)){
for(int y=0; y<arr.length; y++){
if(arr[y]!=0){
x=-1;
break;
}
}
}
您不需要break outerloop
,因为如果您不将x
重置为0,那么循环将会结束。
答案 3 :(得分:0)
如果arr[x]
是{0},那么这是错误的Integer.toString(arr[x])
,如果不能,你就不能arr[x]!=0
:
if(arr[x]!=0){
temp1 = Integer.toString(arr[x]);
或者你的意思是:
if(arr[x]!=0){
temp1 = x;
答案 4 :(得分:0)
不要重绕for循环,只需自己设置值。
int[] copy = arr;
copy[0]=arr[1];
copy[1]=arr[3];
copy[3]=arr[1];
arr=copy;
当然这是一个黑客工作,但因为循环的目的是简化事情(在你的情况下没有发生),最简单的事情就是不使用循环。