0

10 人の顧客が既に挿入されている 1 つの arraylist という新しい arraylist があります。arraylist からランダムな顧客を選択し、それを 2 番目の arraylist に追加するループを実行しています。ただし、顧客を2番目の配列リストに挿入すると、重複が発生します。そのため、顧客を 2 番目の arraylist に追加した後にループが実行されると、1 番目の arraylist から顧客が削除されます。

ただし、実行するとエラーが発生します。Intervals error: java.lang.IndexOutOfBoundsException: Index: 7, Size: 7

ArrayList<String> customer = new ArrayList<String>(Arrays.asList(list));

int customerlist = customer.size();

while (line.isEmpty())
        {
            for (int x = 0; x < customerlist; x++ )
            {
                try
                {
                    Thread.sleep(intervals * 1000);   //Sleep method to hold the arrival time by 1-2 seconds. 
                    int cus = (int) (Math.random() * customerlist);   //Random customer is picked here. 
                    String new_cus = customer.get(cus);   //New customer object is created ere.
                    line.add(new_cus);   //Customer objects are added to the empty LinkedList queue.
                    customer.remove(cus);

                    //For loop statement to outputting the queue.
                    for (String s : line)
                    {
                        System.out.print("[" + s.toString() + " " + "]"); //Outputting each customer and using the ".name" method so customers are readable.
                    }
                    //Outputting the whole queue and stating who has joined the queue.
                    System.out.println("\n" + "The queue has " + line.size() + " customers so far" + "\n" + 
                    new_cus.toString() + " Has Joined the Queue " + " <=== WAITING" + "\n");
                }
                catch(Exception e)   //ERROR handler for sleep method.
                {
                    System.out.println("Intervals error: " + e);   //Outputting the ERROR message.
                    System.exit(0);   //If ERROR found exit system.
                }

            }
        }
4

3 に答える 3

1

You are removing from the array you are effectively iterating over, yet not updating the condition accordingly.

Change:

for (int x = 0; x < customerlist; x++)

to

for (int x = 0; x < customer.size(); x++)

(Or better yet, use an iterator over the underlying ArrayList so that you can remove safely using the Iterator.remove() function.)

Also change the line:

int cus = (int) (Math.random() * customerlist);

to

int cus = (int) (Math.random() * customer.size());
于 2013-04-24T16:22:36.317 に答える
1

これが問題です:

int cus = (int) (Math.random() * customerlist); 

Random.nextInt最初の反復では問題ありませんが (ただし、 を呼び出すほどきれいではありません)、その後customer.size()は (要素が削除されたため) 変更されていますがcustomerlist、同じままです。したがって、次の反復では、間違った範囲の要素を選択しています。

正直なところ、Collections.shuffle()元のリストをシャッフルするために使用した方がよいでしょう - それが最終的に望む結果ですよね?

于 2013-04-24T16:22:57.940 に答える
1

追加

customerlist--;

customer.remove(cus);

また、変更することもできます

for (int x = 0; x < customerlist; x++)

for (int x = 0; x < customer.size(); x++)

.sizeしかし、ループごとに関数を呼び出すと、ローカル変数よりも多くのリソースが使用されると思います。

于 2013-04-24T16:23:54.347 に答える