使用正则表达式将字符串解析为列中的列,以模拟Java中的表

时间:2017-05-17 00:53:22

标签: java regex string list parsing

我有什么:

我有一个看起来像这样的字符串

"a, b, c\nd, e, f\ng, h, i"

每个新行代表一个新行,每个逗号代表一个不同的列

我想做什么:

我试图将其传递到列表中,以便它看起来像这样:

[ [a,d,g], [b,e,h], [c,f,i] ]

它模仿一个表,一个看起来像这样的表:

a   b   c
d   e   f
g   h   i

换句话说,我正在列出每一列。

我知道该怎么做:

我知道如果我正在制作行列表,我可以这样做:

String rows[]= text.split("\\r?\\n");

并最终得到一组行:

{"a, b, c", "d, e, f", "g, h, i"}

然后将每个字符串格式化为一个列表,但是如何使用带有1或无循环的正则表达式完成上面所述的操作?我正在尝试使用O(n)O(nlogn)算法,其中n是行数。谢谢:))

我目前正在做的事情:

 //This is pseudocode so it's not valid

 new list of list called columnList
 String rows[]= text.split("\\r?\\n");
 for each row in rows:
     i=0
     new splitRow = row split by comma
     for each element in splitRow:
         columnList(i).add(element)
         i++

这是我提出的算法,但它非常慢,需要嵌套循环。我不认为它非常有效。

更多信息:

我在Java中完成所有这些

我无法使用任何哈希结构,所以没有字典可悲

很抱歉,如果我的格式很奇怪,我过去在回答问题时遇到了问题。

3 个答案:

答案 0 :(得分:0)

我认为步骤应该是:

  1. 替换" \ n"在原始字符串
  2. 拆分","到String []
  3. 将一维数组转换为二维数组。
  4. 看起来像是:

            String s = "a, b, c\nd, e, f\ng, h, i";
            String[] elements = s.replace("\n", ",").split(",");
            String[][] table = new String[3][3];
            for (int i = 0; i < 3; i++) {
                for(int j = 0; j < 3; j++){
                    table[i][j] = elements[(j * 3) + i];
                }
            }
    

    希望得到这个帮助。

答案 1 :(得分:0)

将您的解决方案与嵌套循环一起使用。如果您担心它不是O(n),请不要:它 O(n)。所花费的时间总是与输入元素的数量成正比。

具体示例#1 :在3行3列输入中,总共有9个元素。外循环执行3次。内循环每次执行3次,共9次。 9个输入= 9个内循环执行。

具体示例#2 :现在假设您给它一个5行,7列输入。你总共有35件商品。外循环执行五次。内循环每次执行七次,总共5x7 = 35次。 35个输入= 35个内循环执行。

摘要 c 列输入 r 行怎么样?总输入项= r x c 。外循环执行 r 次,内循环执行每次 c 次。因此, r x c 总内循环迭代。 r x c 输入项= r x c 内循环迭代。

无论输入元素的总数是多少,内部循环都会执行多次。这实际上是 O(n)定义

答案 2 :(得分:0)

您可以尝试此代码

    String text = "a, b, c\nd, e, f\ng, h, i";
    Pattern pattern = Pattern.compile("(.+)(?:\r?\n|$)");
    Matcher matcher = pattern.matcher(text);
    List<List<String>> result = Lists.newArrayList();
    while (matcher.find()){
        List<String> row = Splitter.on(",").trimResults().splitToList(matcher.group(1));
        result.add(row);
    }

    System.out.println(result);

记住导入:

import com.google.common.base.Splitter;
import com.google.common.collect.Lists;

希望得到这个帮助。