【问题标题】:Concat String in a for loop在 for 循环中连接字符串
【发布时间】:2015-12-16 12:22:26
【问题描述】:

我正在尝试创建一个程序,将用户输入的每个数字分类为偶数、奇数和数字零值。

结果应该是这样的:

User Input: 14005

Output:
Even Numbers: 4
Odd Numbers: 1, 5
Zero's: 0, 0

这是我写的代码,我想在每次循环检查下一个字符时使用字符串连接来添加一个新值,但不知道我的想法是否正确,会如果有人能告诉我我在哪里思考错误。

package com.craydesign;

import javax.swing.JOptionPane;

public class Main {

    public static void main(String[] args) {
        String number = JOptionPane.showInputDialog("Please enter a number: ");
        String evenNumbers = "";
        String oddNumbers = "";
        String numberZero = "";

        for(int i = 0; i < number.length(); i++) {
            if(number.charAt(i) % 2 == 0) {
                evenNumbers.concat(Integer.toString(i) + ", ");
            } else if(number.charAt(i) % 2 != 0) {
                oddNumbers.concat(Integer.toString(i) + ", ");
            } else if (number.charAt(i) == 0){
                numberZero.concat(Integer.toString(i) + ", ");
            }
        }

        JOptionPane.showMessageDialog(null, "Even numbers: " + evenNumbers + "\n" + "Odd numbers: " + oddNumbers + "\n" + "Zero's: " + numberZero);

    }

}

【问题讨论】:

  • 使用StringBuilderStringBuffer 代替String
  • 如果你告诉了你当前代码的确切问题/输出,它会更容易提供帮助。
  • String不可变的。这意味着它的任何方法都不会改变它。它们只是返回一个新值。所以String.concat() 不会在字符串中添加任何内容,它只是返回一个连接的字符串。所以你不应该使用它,你应该使用StringBuilder
  • @kemkoi 查看@TAsk 的答案。您正在划分 ASCII 值。代替String,使用StringBuilder
  • 使用 ArrayList 代替 String。我们不需要连接。我们可以使用 add() 函数轻松添加值

标签: java string concat


【解决方案1】:

使用Character.getNumericValue() 代替charAt(i)

public static void main(String[] args) throws IOException
    {

          String number = JOptionPane.showInputDialog("Please enter a number: ");
          StringBuffer evenNumbers = new StringBuffer();
          StringBuffer oddNumbers =new StringBuffer();
          StringBuffer numberZero =new StringBuffer();

        for(int i = 0; i < number.length(); i++) {
          int value=Character.getNumericValue(number.charAt(i));
          if(value!=0 && value % 2 == 0) {
              evenNumbers.append(value).append(',');
          } else if(value % 2 != 0) {
              oddNumbers.append(value).append(',');
          } else if (value == 0){
              numberZero.append(value).append(',');
          }
        }

          JOptionPane.showMessageDialog(null, "Even numbers: " + evenNumbers + "\n" + "Odd numbers: " + oddNumbers + "\n" + "Zero's: " + numberZero);


      }

编辑:(按排序顺序显示数字)

     String evenNo[]=evenNumbers.toString().split(",");
      String oddNo[]=oddNumbers.toString().split(",");

      Arrays.sort(evenNo);
      Arrays.sort(oddNo);

      JOptionPane.showMessageDialog(null, "Even numbers: " +  Arrays.toString(evenNo) + "\n" + "Odd numbers: " + Arrays.toString(oddNo) + "\n" + "Zero's: " + Arrays.toString(numberZero.toString().substring(0, 

numberZero.length()-1).split(",")));

【讨论】:

  • evenNumbers.append(value+","); 更改为 evenNumbers.append(value).append(","); - 在 SB 的意义上
  • 这解决了它,显然我可以使用 StringBuffer 或 StringBuilder。不知道字符串是不可变的,感谢您的回答!
  • @kemkoi 如果你想按排序顺序显示数字,你可以试试我的编辑。
  • @JacekCz 是的,但这是不必要的 append() 方法调用。但我更新了。
  • 更好的是一次调用(在 JVN 中高度优化)构造 2-3 个对象
【解决方案2】:

您正在使用字符串进行输出并将输出附加到字符串中。

这是个坏主意。由于 String 类是不可变的,因此如果您更改 String 中的任何内容,它将在内存中创建一个新对象。

因此您的解决方案将占用额外的内存。

根据我的说法,您可以通过两种方式解决此问题

  1. 使用 StringBuffer 类而不是 String 类进行追加
  2. 使用 ArrayList 存储您的结果。并遍历 arraylist 并根据需要显示输出。

谢谢, 阿曼

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    相关资源
    最近更新 更多