Java:使用 split 方法添加时,字符串数组列表中出现额外的空格

标签 java if-statement for-loop arraylist lexer

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

之类的行时

(;world 2013/05 // end

我想要打印出来

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;
  }

最佳答案

基本问题是 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

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

关于Java:使用 split 方法添加时,字符串数组列表中出现额外的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23989369/

相关文章:

python - 查找 3 维 numpy 数组的唯一值的索引

java - Flask/Pymongo 对 Java 的 JSON 响应

java - Try block 在执行主体代码之前返回 String

Bash if 语句中的正则表达式匹配

javascript - 运行 if 语句后的 jQuery 停止事件

javascript - 如何避免在 Javascript 的大循环中测试要添加到字符串中的元素是否存在?

javascript - 使用 for every 循环进行 for 循环的最佳方法? - JavaScript

java - 错误: No resource found that matches the given name (at 'theme' with value '@style/Theme.Material.Light.DarkActionBar' )

java - 需要获取 JIRA 用户的工作日志条目

python - 如何替换循环数组中的子字符串[pandas]