【问题标题】:Incorrect Output for List列表输出不正确
【发布时间】:2015-03-10 06:29:08
【问题描述】:

我正在做一个关于列表的初学者 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. 我希望从第一个 System.out.print(list.get(i)); 中得到 10 个字符串值,每个字母都有一个字母

  2. 我还想通过运行第二个System.out.println(list.get(i));从原始列表中减少 2 个字符串值

【问题讨论】:

  • 'int i = 0;我
  • 你的第一个fori = 0循环到i = 10,你得到一个长度为11的字符串,但我不知道这12个字符是从哪里来的。
  • 调试的一个好方法是摆脱随机性。而不是随机字符串(难以调试)将数字作为字符串 list.add(i + "");

标签: java list output


【解决方案1】:

首先,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()))));
} 

【讨论】:

  • 只是一个小问题,+ ""在你的最后一行中做了什么?它将新添加到列表中的内容转换为字符串吗?我认为有人会为此使用 toString() 方法?
  • @KennethYong 是的,与"" 连接会生成String。或者您可以使用String.valueOf(char)(请参阅更新的答案)更好,因为前一种方法在幕后使用StringBuildertoString 是属于扩展 Object 的类型的方法,您可以使用它来打印对象的字符串表示形式。但它不适用于 char 等原始类型。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:
    for (int i = 0; i <= 10; i++)    
    

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

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2021-03-05
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多