【问题标题】:Java: Extra white spaces in String arraylist when added using split methodJava:使用拆分方法添加时,字符串数组列表中的额外空格
【发布时间】:2014-06-02 07:31:20
【问题描述】:

我正在尝试创建一个拆分方法,将从输入文件中读取的行拆分为我返回的字符串数组。问题是当我发送诸如

之类的行时

(;世界 2013/05 // 结束

我想打印出来

String in position 0: (
String in position 1: ;
String in position 2: world
String in position 3: 2013
String in position 4: /
String in position 5: 05
String in position 6: / 
String in position 7: / 
String in position 8: end

忽略空格。但是,目前它正在打印出来

String in position 0: 
String in position 1: (
String in position 2: 
String in position 3: ;
String in position 4: world
String in position 5: 2013
String in position 6: /
String in position 7: 05
String in position 8: 
String in position 9: /
String in position 10: 
String in position 11: /
String in position 12: 
String in position 13: end

我不明白为什么在我的数组列表中添加了额外的空格。如果我使用我的 isOperator 方法中的任何其他运算符,也会发生同样的错误:+, -, *

这里是 split 方法的代码。

private static String[] split(String line) {
    String temp = "";           //var to store each line from input temporarily 
    boolean flag = false;       //var to check if "\" is in the from input
    char[] lineCharArray = line.toCharArray(); //transforms line into array of chars  
    List<String> array = new ArrayList<String>(); //ArrayList to store the split strings temporarily

    for (int i = 0; i<line.length(); i++){
        if (!isDelimiter(lineCharArray[i]) && !isOperator(lineCharArray[i])){
            temp += lineCharArray[i];
        } else {
            array.add(temp);
            temp = "";
            if (isDelimiter(lineCharArray[i])) {
                if (lineCharArray[i] == ' ') {
                    continue;
                }
                array.add( String.valueOf(lineCharArray[i])); 
            }
            if (isOperator(lineCharArray[i])) {
                array.add( String.valueOf(lineCharArray[i])); 
            }
        }
    }
    array.add(temp);

    String [] strings = new String[array.size()]; //Dynamic allocation of array strings
    array.toArray( strings );
    for (int i = 0; i<strings.length; i++) {
        System.out.println("String in position " + i + ": " + strings[i]);
    }
 return strings;
 }

  private static boolean isDelimiter(char c) {
     char [] delimiters = {':', ';', ' ', '}','{', '[',']','(',')',','};
     for (int x=0; x<delimiters.length; x++) {
      if (c == delimiters[x]) return true;      
     }
     return false;
  }

  private static boolean isOperator(char o) {
     char [] operators = {'+', '-', '*','/', '%','<','>','=','!','&','|'};
     for (int x=0; x<operators.length; x++) {
      if (o == operators[x]) return true;      
     }
     return false;
  }

【问题讨论】:

  • 能否提供一个main 方法以便我们轻松测试?

标签: java if-statement for-loop arraylist lexer


【解决方案1】:

基本问题是temp可以为空(开头为空)

所以当...

if (!isDelimiter(lineCharArray[i]) && !isOperator(lineCharArray[i])) {

等于false,您不断向List 添加一个空的temp 值。

要修复它,您可以在添加之前检查temp 是否为空...

} else {
    if (!temp.isEmpty()) {
        array.add(temp);
        temp = "";
    }

您还缺少' ' deilimitere

char[] delimiters = {':', ';', '}', '{', '[', ']', '(', ')', ',', ' '};
                                         Missing me ---------------^

我认为在your previous post中提到了

所以,经过这些更改后,我得到了这个输出

String in position 0: (
String in position 1: ;
String in position 2: world
String in position 3: 2013
String in position 4: /
String in position 5: 05
String in position 6: /
String in position 7: /
String in position 8: end

这是使用调试器的基本过程,因此您可以实时查看代码的执行情况并查看变量的实际情况。

【讨论】:

    猜你喜欢
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 2012-01-30
    相关资源
    最近更新 更多