ArrayList在第一个元素上打印空字符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArrayList在第一个元素上打印空字符相关的知识,希望对你有一定的参考价值。

该程序的主要思想是随机生成一条推文(140个字符)某些字符a-z +'。 +','+';' +':'等......

问题是,当我生成并将每个字符添加到列表时,一切看起来都很好(我添加了一行来检查添加了哪个字符)。但是每当我打印结果时,大部分时间我都会得到null + 140其他字符。这是代码:

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

public class P1{

String tweet;
List<Character> caracteres;
Random rand;
char nextChar;
int number;

public P1(){
    caracteres = new ArrayList<Character>();
    rand= new Random();

    for(int i=97; i<=122; i++){
        nextChar = new Character((char)i);
        caracteres.add(nextChar);
    }
    caracteres.add(new Character((char)58));
    //System.out.println("Added" + new Character((char)58));
    caracteres.add(new Character((char)59));
    //System.out.println("Added" + new Character((char)59));
    caracteres.add(new Character((char)32));
    //System.out.println("Added" + new Character((char)32));
    caracteres.add(new Character((char)13));
    //System.out.println("Added" + new Character((char)13));
    caracteres.add(new Character((char)63));
    //System.out.println("Added" + new Character((char)63));
    caracteres.add(new Character((char)33));
    //System.out.println("Added" + new Character((char)33));
    caracteres.add(new Character((char)46));
    //System.out.println("Added" + new Character((char)46));
    caracteres.add(new Character((char)44));
    //System.out.println("Added" + new Character((char)44));
}

public String generaTweet(){
    for(int i=0; i<140; i++){
        number = Math.abs((rand.nextInt())%34);
        if(number == 13){
            tweet+= '\n';
        }
        else{
            tweet+= caracteres.get(number);
        }
        System.out.println(i + ". " + caracteres.get(number)); //added char
    }
    return tweet;
}


public static void main(String [] args){
    P1 ejer = new P1();
    System.out.println(ejer.generaTweet());
}

}
答案

这是因为你永远不会初始化字段tweet。你的构造函数应该是这样的:

public P1(){
    tweet = "";
    //....
}
另一答案

String tweet;是一个字段,因为它没有显式初始化,所以它将保持其默认值,对于像Strings这样的对象是null。现在你打电话的时候

tweet += someString

你结束了

tweet = tweet + someString;

从一开始tweet就是你要来的null

null + someString

要解决此问题,您可以使用空白字符串初始化tweet

String tweet  = "";

Other improvements:

你应该避免在循环中连接字符串。更好的解决方案是使用StringBuilder而不是append新的文本块。

还要避免使用magic numbers。而不是神秘

for(int i=97; i<=122; i++){
    nextChar = new Character((char)i);
    caracteres.add(nextChar);
}

你可以写

for (char ch = 'a'; ch<='z'; ch++) {
    caracteres.add(ch);
}

这更清楚(你也不需要显式创建Character类的实例,因为Java会自动将char封装到Character)。

另一答案

这条线

String tweet;

应该

String tweet = "";

tweet开始作为null所以第一次添加一个字符串联运算符+使用String "null"tweet

以上是关于ArrayList在第一个元素上打印空字符的主要内容,如果未能解决你的问题,请参考以下文章

字符串的排列组合问题

删除重复元素并计算ArrayList中的重复次数

在 Arraylist 的 listview 的 listitem 上显示值

获取 Intent 片段上的 Serializable ArrayList

打印 List/String 类型的 Arraylist 的所有元素

如何使用特定值映射 ArrayList 元素然后打印它