列表输出不正确

Incorrect Output for List

我正在做有关列表的初学者 Java 教程,遇到以下问题

// 1) Declare am ArrayList of strings
// 2) Call the add method and add 10 random strings
// 3) Iterate through all the elements in the ArrayList
// 4) Remove the first and last element of the ArrayList
// 5) Iterate through all the elements in the ArrayList, again.

下面是我的代码

import java.util.ArrayList;
import java.util.Random;

public class Ex1_BasicArrayList {

    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        for (int i = 0; i <= 10; i++){
            Random rand = new Random();
            String alphabet = "abcdefghijklmnopqrstuvwxyz";
            StringBuilder sb = new StringBuilder();
            sb.append(alphabet.charAt(rand.nextInt(alphabet.length())));
            String randy = sb.toString();
            list.add(randy);
        }
        for (int i = 0; i <  list.size(); i++){
            System.out.print(list.get(i));
        }   
        list.remove(0);
        list.remove(list.size()-1);

        for (int i = 0; i < list.size(); i++){
            System.out.println(list.get(i));
        }
    }
}

我设法生成了一个输出,但它不正确:(

对于我的第一个 System.out.print(list.get(i));,我试图获得 10 个字符串值的输出,但我得到了 12 个。

示例输出:nhgacqhlejph

当我 运行 第二个 System.out.println(list.get(i)); 时,我得到了 8 个字符串值的输出,如果我从列表中的 10 个开始,这是正确的,但我有 12 个,所以它表示删除了 4 个值:/

示例输出:

g
a
c
q
h
l
e
j

有人知道我的代码哪里出错了吗?

重复:

  1. 我希望从第一个字母开始得到 10 个字符串值,每个字母为一个字母 System.out.print(list.get(i));

  2. 我还想通过 运行 宁第二个 System.out.println(list.get(i));

  3. 从原始列表中少获得 2 个字符串值

首先,for 循环应该停止在 i=9 而不是 i=10。因此循环应该如下:

for (int i = 0; i < 10; i++){

其次,在删除第一个和最后一个元素后打印列表时,您不会打印新行来区分两个输出。可以在他们之间加一个println,这样他们就分开了:

for (int i = 0; i <  list.size(); i++){
    System.out.print(list.get(i));
}   
System.out.println();
list.remove(0);
list.remove(list.size()-1);

话虽如此,您的实现并不是很有效,因为它在循环的每次迭代中都创建了一个 StringBuilder 以及一个 Random 对象。您只能创建一个 Random 对象以在每次迭代中使用它。您也不需要 StringBuilder 开头。程序可以简化为如下,例如:

ArrayList<String> list = new ArrayList<String>();
Random rand = new Random();
String alphabet = "abcdefghijklmnopqrstuvwxyz";
for (int i = 0; i < 10; i++){
    list.add(String.valueOf(alphabet.charAt(rand.nextInt(alphabet.length()))));
} 

首先:int i = 0; i <= 10; i++生成11个字符。 第一个循环将产生 11 个字符(没有换行符)。 第二个循环将产生 9 个字符(带换行符)。

因此您在一行中看到 12 个字符(第一个循环中的 11 个字符 + 第二个循环中的一个字符),然后在下一行中看到 8 个字符

for (int i = 0; i <= 10; i++)    

上面的 lop 从 0 到 10 都包括(所以它运行了 11 次)除此之外你的代码看起来不错。将 i<=10 更改为 i<10

我重写了程序,你可以用它来测试

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Ex1_BasicArrayList {

    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        for (int i = 0; i < 10; i++){
            Random rand = new Random();
            String alphabet = "abcdefghijklmnopqrstuvwxyz";
            StringBuilder sb = new StringBuilder();
            sb.append(alphabet.charAt(rand.nextInt(alphabet.length())));
            String randy = sb.toString();
            list.add(randy);
        }

        printList(list);  

        // Remove Elements
        list.remove(0);
        list.remove(list.size()-1);

        printList(list);
    }

    /**
     * @param list
     */
    private static void printList(List<String> list) {
        System.out.println("List size:"+list.size());
        System.out.println("List="+list);
        for(String listElement: list){
            System.out.println(listElement);
        }
    }
}

程序的输出是

List size:10
List=[k, g, i, a, g, k, s, s, x, t]
k
g
i
a
g
k
s
s
x
t
List size:8
List=[g, i, a, g, k, s, s, x]
g
i
a
g
k
s
s
x

备注 列表条目会因随机选择而有所不同,但删除前和删除后的大小分别为 10 和 8