java—在重复值的集群字符串中按与原始字符串中相同的顺序分隔字符串

bqf10yzr  于 2021-07-12  发布在  Java
关注(0)|答案(4)|浏览(386)

我有一个两个字符的字符串。当字符串被分组在一起时,我需要将它们分成一小群字符。假设我的弦是 "xxyyxyxyyyyyxyxyyyyyyyxyyxyyyyyxyyyyyyyxyyy" 我现在需要一个数组,一个列表,任何读起来像: [["xx"],["yy"],["x"],["y"],["x"],["yyyyy"],["x"],["y"],["x"],["yyyyyyy"],["x"],["yy"],["x"],["yyyyy"],["x"],["yyy"],[""],["yyyy"],["x"],["yyy"]] 我需要保持顺序,因为我会迭代它,然后在集群中进行相应的更改。我就是找不到办法。

7rfyedvj

7rfyedvj1#

例如,如果有字母“x”和“y”,则可以使用regexp模式
(x+| y+)
找到你的群集。

public String[] separateString(String s, String firstSymbol, String secondSymbol){
        List<String> l = new ArrayList<>();
        Pattern pattern = Pattern.compile("(" + firstSymbol + "+|" + secondSymbol + "+)");
        Matcher matcher = pattern.matcher(s);
        while(matcher.find()){
            l.add(matcher.group(1));
        }
        return l.toArray(new String[0]);
    }

如果正则表达式有特殊字符,如“+”或“.”,则需要在此解决方案中对其进行筛选:

String s = "+++---";
    String first = "\\+";
    String second = "-";
    String[] result = separateString(s, first, second);
r8uurelv

r8uurelv2#

您只需要从头到尾扫描字符串并检查是否连续 x s和 y 把它们收集起来。

for ( int i = 0; i < s.length(); ) {
   int sz = list.size();
   int j = i;
   while ( i < s.length() && s.charAt(i) == 'x' ) i++;
   if ( i > j )  list.add(s.substring(j,i));
   j = i;
   while ( i < s.length() && s.charAt(i) == 'y' ) i++;
   if ( i > j ) list.add(s.substring(j,i));
   if ( sz == list.size() ) i++;
}
ryevplcw

ryevplcw3#

你可以用一个for循环扫描字符串。只需检查前面的字符。如果它们相同,请继续,否则将上一个子字符串添加到结果中。你可以使用指针变量,比如 start 它表示上一个子串从何处开始。下面的代码也适用于除 x 以及 y .
代码段:

import java.util.*;
public class Main{
    public static void main(String[] args) {
        String s = "xxxxxxxxyyxyxxxxyyyyyxyxxxxyyyyyyyxyyxyyyyyxyyyxxxyyyyxyyy";
        List<String> res = new ArrayList<>();
        int start = 0;
        for(int i=1;i<s.length();++i){
            if(s.charAt(i) != s.charAt(i-1)){
                res.add(s.substring(start,i));
                start = i;
            }
        }
        res.add(s.substring(start,s.length())); // to add last unadded substring of same characters
        System.out.println(res.toString());
    }
}

demo:httpshttp://onlinegdb.com/skrqmaqqu

qyswt5oh

qyswt5oh4#

编辑:看看某个家伙的答案,比我的答案好多了。
如果需要,somedude的答案可以概括为任意数量的符号:

List<String> clusters = new ArrayList<String>();
for(int i = 0; i < s.length();)
{
    int j = i;
    while(i < s.length() && s.charAt(i) == s.charAt(j)) i++;
    if(i > j) clusters.add(s.substring(j, i));
}

相关问题