Как я могу разделить строку с split () на отдельные строки с 15 элементами в каждом индексе? - PullRequest
0 голосов
/ 30 апреля 2020

Обычно с split() он делит всю строку на одно регулярное выражение.

Так что, если я возьму String objects= "door,cat,house,trash"; и сделаю objects.split(","), он разбьет его на массив String[] objects= {"door","cat","house","trash"};, как вы, вероятно, знаете.

Но я не хочу отделять его от каждой запятой. Я хочу отделить его от каждого 15-го пункта. Так что мой список будет иметь String[] objects= {"door,cat,house,trash...obj15","obj1,obj2,obj3...obj15"};

Имеет ли это смысл? Как бы я go сделал это?

Ответы [ 4 ]

2 голосов
/ 30 апреля 2020

split() не годится для этого. Вместо этого используйте find() l oop.

Демо (Java 4 +)

String input = "door,cat,house,trash,e5,f6,g7,h8,i9,j10,k11,l12,m13,n14,o15,p16,q17,r18,s19,t20";

Pattern p = Pattern.compile("(?=.)((?:[^,]*,){0,4}[^,]*),?");
List<String> result = new ArrayList<>();
for (Matcher m = p.matcher(input); m.find(); )
    result.add(m.group(1));

for (String s : result)
    System.out.println('"' + s + '"');

Демо (Java 9+) )

String input = "door,cat,house,trash,e5,f6,g7,h8,i9,j10,k11,l12,m13,n14,o15,p16,q17,r18,s19,t20";

String[] result = Pattern.compile("(?=.)((?:[^,]*,){0,4}[^,]*),?").matcher(input)
                  .results().map(m -> m.group(1)).toArray(String[]::new);

Arrays.stream(result).forEach(s -> System.out.println('"' + s + '"'));

Выход

"door,cat,house,trash,e5"
"f6,g7,h8,i9,j10"
"k11,l12,m13,n14,o15"
"p16,q17,r18,s19,t20"

Конечно, вы должны изменить {0,4} на {0,14}, если вы хотите 15 значений на блок.

1 голос
/ 30 апреля 2020

Другие ответы предлагают использовать сложные регулярные выражения. Я бы избежал этого. Используйте Guava, чтобы разбить разделенную строку на группы по пятнадцать, и объедините каждую группу запятыми:

String[] objects = "door,cat,trash,house,...";
List<String> list = Lists.newArrayList(objects.split(","));
String[] result = Lists.partition(list, 15).stream()
    .map(each -> String.join(",", each))
    .toArray(String[]::new);
0 голосов
/ 30 апреля 2020

Первое, что пришло в голову - попробуйте разделить их с помощью split (","), затем l oop и добавьте любой другой символ на 15-е место, кроме (например, $). Затем вы разделяете это (например, split ("$"))

Я не знаю, насколько это эффективно, но здесь вы go.

0 голосов
/ 30 апреля 2020

Попробуйте следующий шаблон регулярных выражений [a-z]+(,[a-z]+){14}. Это будет соответствовать списку из 15 слов, разделенных запятыми. На вашем месте я бы переключился на использование предоставленных классов Matcher и Pattern, чтобы найти этот шаблон регулярных выражений (вместо использования split).

Pattern pattern = Pattern.compile("[a-z]+(,[a-z]+){14}");
Matcher matcher = pattern.matcher("dog,door,cat,other,etc...");

while (matcher.find()) {
    System.out.println(matcher.group());
}
...