加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Split String – 笛卡尔方式

发布时间:2020-12-15 05:15:36 所属栏目:Java 来源:网络整理
导读:给出以下字符串: “foo bar-baz-zzz” 我想将它分成字符“”和“ – ”,保留它们的值,但得到所有输入组合. 我想得到一个包含二维数组 {{"foo","bar","baz","zzz"},{"foo bar",{"foo","bar-baz",{"foo bar-baz","baz-zzz"},"bar-baz-zzz"},{"foo bar-baz-zzz
给出以下字符串:

“foo bar-baz-zzz”

我想将它分成字符“”和“ – ”,保留它们的值,但得到所有输入组合.

我想得到一个包含二维数组

{{"foo","bar","baz","zzz"},{"foo bar",{"foo","bar-baz",{"foo bar-baz","baz-zzz"},"bar-baz-zzz"},{"foo bar-baz-zzz"}}

Java中是否有任何内置方法以这种方式拆分字符串?也许在像Apache Commons这样的库中?或者我必须写一个for循环的墙?

解决方法

这是一个有效的递归解决方案.我使用了List< List< String>>而不是二维数组,使事情更容易.代码有点难看,可能会整理一下.

样本输出:

$java Main foo bar-baz-zzz
Processing: foo bar-baz-zzz
[foo,bar,baz,zzz]
[foo,baz-zzz]
[foo,bar-baz,bar-baz-zzz]
[foo bar,zzz]
[foo bar,baz-zzz]
[foo bar-baz,zzz]
[foo bar-baz-zzz]

码:

import java.util.*;

public class Main {
  public static void main(String[] args) {
    // First build a single string from the command line args.
    StringBuilder sb = new StringBuilder();
    Iterator<String> it = Arrays.asList(args).iterator();
    while (it.hasNext()) {
      sb.append(it.next());

      if (it.hasNext()) {
        sb.append(' ');
      }
    }

    process(sb.toString());
  }

  protected static void process(String str) {
    System.err.println("Processing: " + str);
    List<List<String>> results = new LinkedList<List<String>>();

    // Invoke the recursive method that does the magic.
    process(str,results,new LinkedList<String>(),new StringBuilder());

    for (List<String> result : results) {
      System.err.println(result);
    }
  }

  protected static void process(String str,int pos,List<List<String>> resultsSoFar,List<String> currentResult,StringBuilder sb) {
    if (pos == str.length()) {
      // Base case: Reached end of string so add buffer contents to current result
      // and add current result to resultsSoFar.
      currentResult.add(sb.toString());
      resultsSoFar.add(currentResult);
    } else {
      // Step case: Inspect character at pos and then make recursive call.
      char c = str.charAt(pos);

      if (c == ' ' || c == '-') {
        // When we encounter a ' ' or '-' we recurse twice; once where we treat
        // the character as a delimiter and once where we treat it as a 'normal'
        // character.
        List<String> copy = new LinkedList<String>(currentResult);
        copy.add(sb.toString());
        process(str,pos + 1,resultsSoFar,copy,new StringBuilder());

        sb.append(c);
        process(str,currentResult,sb);
      } else {
        sb.append(c);
        process(str,sb);
      }
    }
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读