【问题标题】:ArrayList printing null character on first elementArrayList 在第一个元素上打印空字符
【发布时间】:2015-12-11 03:45:47
【问题描述】:

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

问题是,当我生成每个字符并将其添加到列表中时,一切看起来都很好(我添加了一行来检查添加了哪些字符)。但是,每当我打印结果时,大部分时间我都会得到 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());
}

}

【问题讨论】:

  • @TAsk 他在他的问题中写道 - 他正在生成一条随机推文。
  • 因为这是主要思想,所以数组列表只有有效字符的完整列表。因此,当我使用随机数访问时,我正在做的是向字符串推文添加一个随机字符。

标签: java arraylist null char


【解决方案1】:

这是因为您从未初始化字段tweet。您的构造函数应如下所示:

public P1(){
    tweet = "";
    //....
}

【讨论】:

  • 这成功了,没有意识到,谢谢。我会尽快将其标记为正确,因为您也是第一个。
  • @Alan - 虽然您的问题已解决,但请考虑使用 StringBuilder.apped() 继续在字符串中添加内容,而不是 + String 上的连接运算符
  • 不得不问,只是串联有什么问题?提前致谢。
  • @Alan 每次在循环中调用 result = result+otherString 之类的代码时(假设 result 是字符串),您正在创建临时的 StringBuilder,它需要首先从 result 复制字符,然后是字符来自otherString,然后创建新的字符串对象(这将是复制字符的总和)。所以在每次迭代中你需要花更多的时间来复制之前的result,因为它会变得更大。相反,最好显式创建自己的 StringBuilder 并将其附加到所有部分,然后将其转换为 toString()
【解决方案2】:

String tweet; 是一个字段,由于它没有被显式初始化,它将保持其默认值,对于像字符串这样的对象是null。现在当你打电话时

tweet += someString

你最终得到了

tweet = tweet + someString;

因为一开始tweetnull 你得到了

null + someString

要解决这个问题,你可以用空白字符串初始化tweet

String tweet  = "";

其他改进:

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

同时避免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)。

【讨论】:

  • @Alan 没问题,接受答案是个人选择,只要你接受的答案是正确的,我不介意你选择其他答案:) 我很高兴你也从这个答案中学到了一些东西。
【解决方案3】:

线

String tweet;

应该是

String tweet = "";

tweetnull 开头,因此第一次添加字符时,连接运算符+ 使用String "null" 表示tweet

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 2019-01-19
    相关资源
    最近更新 更多