如何回放for循环?

时间:2015-12-13 11:03:40

标签: java for-loop

你如何倒回或回到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);

    }

Here's something...

这是约瑟夫执行计划......

编辑:

我找到了解决方案。

5 个答案:

答案 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 ifarr[y]!=0 x设置为0,然后for循环中的x++设为1 之前重做测试。

所以你需要设置x=-1。然后,在重试测试之前,for循环中的x++使其成为0。然后使用x 0重新完成测试。

PS(用谷歌搜索你没有解释的内容。)(虽然你的代码似乎想要执行到没有幸存者,所以我会假设。)

顶部if“执行”x的{​​{1}}元素,如果它是arr非零countnum元素,则将其设置为零模数arr的最后一个。如果底部arr.lengthif包裹回x -1(每个上面),则arr.length-1时第三个语句可以break为主循环全是零。或者,如果底部arrif包裹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;

当然这是一个黑客工作,但因为循环的目的是简化事情(在你的情况下没有发生),最简单的事情就是不使用循环。