【问题标题】:ArrayList is not behaving as expected in for loop [closed]ArrayList 在 for 循环中的行为不符合预期[关闭]
【发布时间】:2017-09-17 14:17:14
【问题描述】:
import java.util.*;

public class elevator_EXPERIMENT {
    public static void main(String[] args) {

        ArrayList<Integer> UpArrayList = new ArrayList<Integer>();
        ArrayList<Integer> DownArrayList = new ArrayList<Integer>();

        int[] Floor = new int[12];
        for (int i = 0; i < Floor.length; i++) {
            Floor[i] = i + 1;
        }
        while (UpArrayList.size() != 8) {
            if (Math.random() > 0.5) {
                Random x = new Random();
                int UpRandom = (x.nextInt(11 - 1) + 1) + 1;
                Random x1 = new Random();
                int UpRandom1 = (x1.nextInt(11 - 1) + 1) + 1;
                if (UpRandom != UpRandom1 && !UpArrayList.contains(Floor[UpRandom])) {
                    UpArrayList.add(UpRandom1);
                }
            }
        }
        while (UpArrayList.size() != 8) {
            Random x = new Random();
            int UpRandom = (x.nextInt(11 - 1) + 1) + 1;
            while (UpArrayList.contains(Floor[UpRandom])) {

            }
        }
        System.out.print("Unsorted floors going up ");
        for (int i = 0; i < UpArrayList.size(); i++) {
            System.out.print(UpArrayList.get(i) + " ");
        }
        System.out.println();
        while (DownArrayList.size() != 5) {
            if (Math.random() > 0.5) {
                Random y = new Random();
                int DownRandom = (y.nextInt(11 - 1) + 1) + 1;
                if (DownArrayList.contains(Floor[DownRandom])) {
                    Random y1 = new Random();
                    int DownRandom1 = (y1.nextInt(11 - 1) + 1) + 1;
                    if (DownRandom != DownRandom1 && !DownArrayList.contains(Floor[DownRandom1])) {
                        DownArrayList.add(DownRandom1);
                    }
                } else {
                    DownArrayList.add(Floor[DownRandom]);
                }
            }
        }
        System.out.print("\nUnsorted floors going down ");
        for (int i = 0; i < DownArrayList.size(); i++) {
            System.out.print(DownArrayList.get(i) + " ");
        }
        Collections.sort(UpArrayList);
        System.out.print("\n\n" + "Sorted floors going up ");
        for (int i = 0; i < UpArrayList.size(); i++) {
            System.out.print(UpArrayList.get(i) + " ");
        }
        Collections.sort(DownArrayList, Collections.reverseOrder());
        System.out.print("\n\n" + "Sorted floors going down ");
        for (int i = 0; i < DownArrayList.size(); i++) {
            System.out.print(DownArrayList.get(i) + " ");
        }
        System.out.println();
        for (int i = 0; i < 8; i++) {
            int floornumber = 1;
            System.out.println("\nStarting at floor " + floornumber);
            floornumber++;
            System.out.println("Going up: now at floor " + UpArrayList.get(floornumber));
            System.out.println("Stopping at floor " + UpArrayList.get(floornumber) + " for 3 seconds -> 1,2,3");
            SleepTimer(3000);
        }
    }

    public static void SleepTimer(int time) {
        try {
            Thread.sleep(time);
        } catch (Exception e) {
            System.out.println("Something went wrong");
        }
    }
}

您好,请看一下 SleepTimer 方法上面的 for 循环。我有两个问题。我的目标是创建一个电梯 txt 模拟器,电梯有 12 层。我创建了两个 Arraylist:一个包含 8 个随机唯一楼层,另一个包含 5 个随机唯一楼层,分别标记为 UpArrayList 和 DownArrayList。然后我对它们进行排序。然后我应该创建一个类似于这样的 txt 提示:

2 3 4 6 7 8 10 11 Sorted ArrayList

        Starting at floor 1
        Going up: now at floor 2
    Stopping at floor 2 for 3 seconds  1, 2, 3 

    Starting at floor 2 
        Going up: now at floor 3
    Stopping at floor 3 for 3 seconds  1, 2, 3

    Starting at floor 3 
        Going up: now at floor 4
    Stopping at floor 4 for 3 seconds  1, 2, 3

    Starting at floor 4 
        Going up: now at floor 5
        Going up: now at floor 6
     Stopping at floor 6 for 3 seconds  1, 2, 3

     Starting at floor 6
         Going up: now at floor 7
    Stopping at floor 7 for 3 seconds  1, 2, 3

     Starting at floor 7
         Going up: now at floor 8                                                                            
     Stopping at floor 8 for 3 seconds  1, 2, 3

基本上我希望for循环(在程序末尾)的提示格式说

Starting at Floor1
Going up: now at floor[FirstElementofUpArrayList]
Stopping at floor[FirstElementofUpArrayList" for 3 seconds -> 1,2,3
Starting at floor[SecondElementofUpArrayList]
Going up: now at floor[SecondElementofUpArrayList] for 3 seconds -> 1,2,3

直到我到达 UpArrayList 的最后一个元素。

【问题讨论】:

  • "查看 SleepTimer 方法上方的 for 循环" - 如果您只对那部分代码有问题,为什么还要包括所有其余部分?跨度>
  • 因为我相信 UpArrayList 的元素以及我如何组织 Arraylist 可能与为人们提供上下文以及我需要 forloop 如何发挥作用有关。如果我没有适当地浓缩问题,我很抱歉。
  • 所以您编写了一个示例输出并希望我们提供生成它的代码?这不是这里的工作方式
  • 再次抱歉,我没有做到应有的具体细节。我不想要样本输出,样本输出作为可能的相同输出存在。我想要的是“基本上我想要提示的格式……说”和以下 5 行之后的内容。我想把这 5 行英文转换成我可以用 Java 处理的东西。

标签: java eclipse for-loop arraylist


【解决方案1】:

“ArrayList 在 forloop 中的行为不符合预期”

它什么也没说,但是看看你的实现,我猜你的问题是 java.lang.IndexOutOfBoundsException 这是因为你的列表的大小是 8 并且元素的索引是从 0 到 7。最后一个循环的最后一次迭代正在调用UpArrayList.get(8),但没有第 9 个元素。 改变

UpArrayList.get(floornumber);

UpArrayList.get(i);

【讨论】:

  • 谢谢你,你真的是个圣人。非常感谢你的朋友。 1.5 小时让我的头撞到那段代码,却想不通。
猜你喜欢
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 2020-12-25
  • 2021-12-07
  • 2013-05-13
  • 2013-07-19
相关资源
最近更新 更多