【问题标题】:Changing a string to match a char array [duplicate]更改字符串以匹配 char 数组 [重复]
【发布时间】:2015-10-17 19:37:54
【问题描述】:

我在编程方面非常缺乏经验,所以请多多包涵。

我必须编写一个模仿 String 类的某些属性的类。在这个特定的方法中,我必须获取一个 char 数组并获取一个字符串来匹配它。

这是我目前所拥有的:

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 }

这里要提一下char数组是null,但是在main方法中,是赋值给它的。

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

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

我不知道为什么它不将 String s 识别为变量。

【问题讨论】:

    标签: java arrays string


    【解决方案1】:

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

    String s = new String(charArray);
    

    现在到你的代码:

    String s;
    s.length() = word.length;
    

    这里有两个问题,第一个 s 没有初始化,在你可以对它做任何事情之前,你需要给它赋值:

    String s = new String();
    

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

    String s = "";
    

    Next String 是一个不可变的类,这意味着一旦创建,您就不能更改任何属性。加上 s.length() 返回一个 int 值和 NO 指针/引用,这意味着你不能像那样为它分配一个新值。也一样

    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();
    

    【讨论】:

    • String s = new String(); 请改用String s = ""; :)。
    • 是的:)。但是您必须承认,创建一个像 OP 想要创建的 String 开始时效率很低。
    • 正确,但既然你想向他展示更好的方法,你也可以通过避免空字符串构造函数来做到这一点:D。
    【解决方案2】:

    错误在这里:

    s.length() = word.length;
    s.charAt(i) = word[i];    // same here
    

    您正在尝试将长度分配给 length 方法的返回值。

    另请注意,String 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();
    }
    

    【讨论】:

    • “还要注意,String s 是未初始化的。所以它会在运行时抛出 NPE。” 这是不正确的。请再次检查;P。
    • s.charAt(i) 这就是我的意思。
    • 所以你认为s.charAt(i) 会在运行时抛出异常,即使这段代码没有编译?这怎么可能? (我希望这个“提示”能帮助您注意,“它会在运行时抛出 NullPointerException”是错误的)。
    • @Tom 当您修复所有编译问题时。我正在尝试放弃。
    • 一个错误的东西?当局部变量未初始化时,代码将无法编译。您需要初始化它,然后......好吧,它不再是未初始化的。如果有人用null 初始化它,它只会抛出提到的异常,这将是相当...蹩脚的。
    【解决方案3】:

    错误正是它在锡上所说的。赋值的左边必须是一个变量。

    变量基本上是一个可以保存值的容器,您可以将值分配给这些容器。例如,在行中

    int wordLength = word.length;
    

    您定义了这样一个容器,命名为 wordLength,并在类变量word.length 中分配值。这里word.length是一个代表字符数组长度的值。

    不管怎样,试试这个

    s.length() = word.length;
    

    然后请记住,s.length() 是一种方法,它返回一个值,而不是一个变量,因此,您正在尝试将一个值分配给一个值。这没有意义。

    【讨论】:

      【解决方案4】:

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

      你只需要这个:

      String s = String.valueOf(word);
      

      【讨论】:

        【解决方案5】:

        调用方法长度会返回一个值。您的代码的错误是您试图将一个值分配给一个返回一个没有意义的值的方法。 其次,出于性能目的,最好使用 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(); 
         }
        

        【讨论】:

        【解决方案6】:
        s.length() = word.length;
        

        你不能那样做。 length() 方法是提供String 大小的访问方法。它不是一个变量。注意:

        int variable; // the non-initialized variable
        s.length(); // the method invoking
        variable = s.length(); // the variable initializing
        

        你可以使用下面的sn-p:

        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个字符开头..
        • @KevinAvignon "它以 16 个字符的大小开始":如果需要,StringBuilder 会扩展底层数组。还是你的意思是别的?
        • 不确定哦!用于指定构建器的大小!
        • @KevinAvignon,在这种情况下它没有那么重要的意义。
        • @KevinAvignon 如果您已经知道数组的最终大小(或多或少),您可以这样做。这样可以避免增加数组大小,这会耗费时间。
        猜你喜欢
        • 1970-01-01
        • 2013-11-23
        • 1970-01-01
        • 2015-03-08
        • 1970-01-01
        • 2012-07-06
        • 2021-02-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多