Отдельная строка в строках кластера с повторяющимися значениями в том же порядке, в котором они отображаются в исходной строке - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть строка с двумя символами. Мне нужно разделить строку на маленькие группы символов, когда они сгруппированы вместе. Допустим, моя строка имеет вид "xxxxxxxxyyxyxxxxyyyyyxyxxxxyyyyyyyxyyxyyyyyxyyyxxxyyyyxyyy"

Теперь мне нужен массив, список, что бы это ни читалось следующим образом: [["xxxxxxxx"],["yy"],["x"],["y"],["xxxx"],["yyyyy"],["x"],["y"],["xxxx"],["yyyyyyy"],["x"],["yy"],["x"],["yyyyy"],["x"],["yyy"],["xxx"],["yyyy"],["x"],["yyy"]]

Мне нужно сохранить порядок, как я бы его повторил и затем внесите соответствующие изменения в кластеры. Я просто не могу найти способ сделать это.

Ответы [ 4 ]

1 голос
/ 13 февраля 2020

Вам просто нужно отсканировать строку от начала до конца, проверить наличие непрерывных x s и y s и собрать их.

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++;
}
0 голосов
/ 14 февраля 2020

Вы можете просто просмотреть строку с одним для l oop. Просто сверьтесь с предыдущим персонажем. Если они одинаковые, продолжайте, иначе добавьте предыдущую подстроку к результату. Вы можете использовать переменную-указатель, скажем 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());
    }
}

Демонстрация: https://onlinegdb.com/SkRqmAQQU

0 голосов
/ 13 февраля 2020

РЕДАКТИРОВАТЬ: См. Ответ SomeDude, намного лучше, чем мой был.

При желании ответ 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));
}
0 голосов
/ 13 февраля 2020

Например, если у вас есть буквы "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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...