Как пропустить 3 элемента в массиве строк Java и получить следующие 3 элемента - PullRequest
0 голосов
/ 19 января 2019

Я хочу получить строки массива, разделенные на 3 элемента.Например, мне нужно пропустить 3 элемента 0,1,2 и взять элементы 3,4,5.И повтори.(пропустите 6,7,8 и получите 9,10,11) до конца массива.Как мне это сделать?

String s1[] = hh.split("\\r?\\n");
System.out.println(s1[3]);

for (int i=0;i<s1.length; i++){

}

Вывод подстроки:


            org.springframework
            spring-jdbc
            1.0-m4

            org.apache.tomcat
            tomcat-jdbc
            7.0.19

            commons-configuration
            commons-configuration
            20030311.152757

            commons-io
            commons-io
            0.1

            org.springframework.security.oauth
            spring-security-oauth2
            2.1.1.RELEASE


Ответы [ 5 ]

0 голосов
/ 19 января 2019

Это мой метод для использования:

public static String[] getSomeThing(String[] array) {
    List<String> container = new ArrayList<>(3);
    List<String> tmp = new ArrayList<>();
    int fullTimes = 0;
    for (String str : array) {
        if (container.size() == 3) {
            if (++fullTimes % 2 == 0) {
                tmp.addAll(container);
            }
            container.clear();
            container.add(str);
        } else {
            container.add(str);
        }
    }
    if (fullTimes % 2 != 0) {
        tmp.addAll(container);
    }

    String[] result = new String[tmp.size()];
    tmp.toArray(result);
    return result;
}
0 голосов
/ 19 января 2019

Вы можете использовать потоки Java 8.Если s имеет тип E:

List<E> collect = 
    IntStream.range(0, s.length) // 0...n-1
        .filter(i -> i/3%2 == 0) // g = i/3 is the number of the group and we take one group out of to (g % 2 == 0)
        .mapToObj(i -> s[i]) // take s[i]
        .collect(Collectors.toList());
0 голосов
/ 19 января 2019

Просто разработайте ответ, который дал Антониос, чтобы он дал вам желаемый результат.

int limit = s1.length;

if (limit > 2){
    for(int i=3; i<limit; i+=6){
        for(int j=0;j<3;j++){
            if(i+j > limit)
               break;
            System.out.println(s1[i+j]);
        }
    if(i+6 > limit)
        break;
    }
}
0 голосов
/ 19 января 2019

Решение с использованием оператора по модулю и одного цикла. Нет риска IndexOutOfBounds.

for (int i = 0; i < list.length; i++) {
    if (i % 6 > 2) {
        System.out.println(list[i]);
    }
}

Вы можете перевести условие в i % 6 < 3, если вместо этого хотите получить первые 3 из каждых 6 элементов в массиве.

РЕДАКТИРОВАТЬ: следующее берет ваш ввод и помещает его в List<String[]>, где каждый элемент содержит 3 строки.

import java.nio.file.*;
import java.util.stream.Stream;
import java.util.*;
import java.nio.charset.Charset;

public class Partition2 {
    public static void main(String[] args) {
        String[] input = ...

        try (Stream<String> stream = Arrays.stream(input)) {
            // https://stackoverflow.com/a/34759493/3717691
            String[] array = stream.map(line -> line.trim()).filter(line -> !line.isEmpty()).toArray(String[]::new);

            List<String[]> results = new ArrayList<String[]>();
            String[] tmp = new String[3];
            for (int i = 0; i < array.length; i++) {
                tmp[i % 3] = array[i];
                if (i % 3 == 2) {
                    results.add(tmp);
                    tmp = new String[3];
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
0 голосов
/ 19 января 2019
for(int i=3;i<s1.length;i+=6){
   for(int j=0;j<3;j++){
         s1[i+j]; // here is your element
    }
}

просто отрегулируйте условия циклов, как вы могли бы получить IndexOutOfBoundsException, если размер arrag не делится на 6

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...