将一个字符串转换为匹配一个字符数组

4

我很缺乏编程经验,请多包涵。

我需要编写一个类来模拟String类的一些属性。在这个特定的方法中,我需要取一个字符数组并获取与之匹配的字符串。

目前为止,我的代码如下:

1 char[] word = new char[80];
2 int wordLength = word.length;    
3
4 public String getString () {
5      String s;
6      s.length() = word.length;
7      for (int i = 0; i < word.length; i++) {
8           s.charAt(i) = word[i];
9      }
10     return s; 
11 }

需要说明的是,在这里字符数组为空,但在主方法中已经为其赋值。

这是我在第6和第8行遇到的错误:

The left-hand side of an assignment must be a variable

我不知道为什么它不能将字符串s识别为变量。
6个回答

5

我不确定你是否被允许使用那个,但你可以像这样从字符数组创建一个字符串:

String s = new String(charArray);

现在开始进入你的代码:
String s;
s.length() = word.length;

这里有两个问题,首先s未被初始化,在你对它进行任何操作之前,你需要为它赋一个值:

String s = new String();

由于这会创建一个全新的 String,因此最好使用以下代码,因为字符串已经被缓存:

String s = "";

Next String 是一个不可变类,这意味着一旦创建后就不能更改任何属性。此外,s.length() 返回一个 int 值而非指针/引用,这意味着您不能像那样为其赋新值。同样适用于其他方法。

s.charAt(i) = word[i];

这是不可能的。

要逐个字符创建一个String,你可以像这样做:

String s = "";
for (char c : charArray)
{
    s += c;
}

请注意,每次执行 s += c 都会创建一个新的 String
更好的做法是使用 StringBuilder
StringBuilder s = new StringBuilder();
for (char c : charArray)
{
    s.append(c);
}
s.toString();

同样地,你可以用一行代码完成这个操作:

String s = new StringBuilder().append(charArray).toString();

1
请使用String s = "";代替String s = new String(); - Tom
是的 :). 但您必须承认,像OP想要创建的字符串一样创建它本来就相当低效。 - Pinkie Swirl
正确,但是既然你喜欢展示更好的方法,你也可以避免使用空字符串构造函数:D。 - Tom

4
错误出现在这里:
s.length() = word.length;
s.charAt(i) = word[i];    // same here

您正在尝试将长度分配给长度方法的返回值。
请注意,未初始化字符串s。
最简单的getString()形式如下:
public String getString () {
  String s = "";
  for (int i = 0; i < word.length; i++) {
    s = s + word[i];
  }
  return s;
}

使用StringBuilder比字符串拼接更好。

public String getString () {
  StringBuilder builder = new StringBuilder();
  for (int i = 0; i < word.length; i++) {
    builder.append(word[i]);
  }
  return builder.toString();
}

请注意,字符串s未初始化,因此在运行时会抛出NPE异常。这是不正确的,请再次检查;P。 - Tom
s.charAt(i) 这就是我的意思。 - YoungHobbit
你认为s.charAt(i)会在运行时抛出异常,即使这段代码无法编译?这怎么可能呢?(我希望这个“提示”能帮助你注意到,“它会在运行时抛出NullPointerException”是错误的)。 - Tom
@Tom 当你解决完所有编译问题后,请让我知道。我正在提前通知你。 - YoungHobbit
有错误的提示?当一个本地变量没有初始化时,代码就无法编译。你需要初始化它,然后...好吧,它不再是未初始化的了。只有在使用null进行初始化时,它才会抛出上述异常,这将是相当...糟糕的。 - Tom
显示剩余2条评论

3

错误信息就是它所描述的。赋值语句左边必须是一个变量。

变量基本上是一个可以容纳值的容器,你可以将值赋给这样的容器。例如,在以下代码中:

int wordLength = word.length;

您定义了一个名为wordLength的容器,并将类变量word.length中的值赋给它。这里,word.length是表示字符数组长度的值。

无论如何,当尝试这样做时

s.length() = word.length;

如果您使用s.length(),请记住这是一个方法,它返回一个值,而不是变量,因此您正在尝试将一个值赋给另一个值,这是没有意义的。

2

s.charAt(i)s.length()仅返回值。

你只需要这个:

String s = String.valueOf(word);

2
调用 length 方法会返回一个值。你代码的错误在于你试图给一个返回值的方法赋值,这是没有意义的。 其次,为了提高性能,你最好使用 StringBuilder 类从 char 数组构建字符串。在创建时,只需使用 word.length() 指定长度,然后在 for 循环内部调用 append 方法将内容添加到构建器中。最后,使用 toString() 方法返回字符串构建器的字符串。
public String getString () {
      StringBuilder sb = new StringBuilder(word.length);
      for (int i = 0; i < word.length; i++) {
           sb.append(word[i].toString());// you must give a string to the string builder
      }
     return sb.toString(); 
 }

当您查看以下链接时,可以了解更多有关StringBuilder API的信息:https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html - Kevin Avignon

1
s.length() = word.length;

你不能这样做。 length() 方法是一个访问方法,提供了一个字符串的大小。它不是一个变量。请注意:
int variable; // the non-initialized variable
s.length(); // the method invoking
variable = s.length(); // the variable initializing

您可以使用以下代码片段:

String s = "";
for (int i = 0; i < word.length; i++) {
    s += word[i]; // Both "+" and "+=" operators are a bad practice
}
return s;

更好的做法是使用 StringBuilder 将字符连接成一个 String
StringBuilder builder = new StringBuilder();
for (int i = 0; i < word.length; i++) {
    builder.append(word[i]);
}
return builder.toString();

你不需要指定它的长度(StringBuilder),因为它最初是以16个字符的大小开始的。 - Kevin Avignon
1
@KevinAvignon:“它从16个字符的大小开始”:如果需要,StringBuilder会扩展底层数组。或者您是指其他内容? - Tom
不太确定那个,哎呀!用于向构建器指定大小! - Kevin Avignon
@KevinAvignon,在这种情况下,它并没有那么重要的意义。 - Andrew Tobilko
2
@KevinAvignon 如果您已经知道数组的最终大小(或多或少),那么可以这样做。这避免了增加数组大小所需的时间成本。 - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接