【问题标题】:How to skip 3 elements in a java string array and get next 3 elements如何跳过java字符串数组中的3个元素并获取下一个3个元素
【发布时间】:2019-01-19 12:43:49
【问题描述】:

我想得到一个由 3 个元素分隔的 Array 字符串。例如我需要跳过 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


【问题讨论】:

  • 太宽泛了。试过什么?
  • 您的预期输出是什么,每组 3 个的新数组还是...?
  • @JoakimDanielson 是每个 1 组的新数组

标签: java loops


【解决方案1】:

使用模运算符和单个循环的解决方案。没有 IndexOutOfBounds 的风险。

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

如果您想要数组中每 6 个元素中的前 3 个,则可以将条件翻转为 i % 6 &lt; 3

编辑:以下内容接受您的输入并将其放入 List&lt;String[]&gt; 中,其中每个元素包含 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();
        }
    }
}

【讨论】:

  • 很干净,我喜欢这个
  • 最后一个元素没有显示。最后一组是在 4 个元素之后。有什么解决办法吗?
  • @nascar895 查看您的原始输入后,您的意图似乎是获取文本并删除仅包含空格的行?最好的解决方案是在解析期间删除空白行。如果我是对的,请告诉我。
  • @Jeppe 是的会更好。有什么方法可以在不使用 new 分割的情况下分割空格
  • @nascar895 查看我的更新。您可以在读取文件时过滤掉空行(如果它来自文件)。它是否达到了您的预期?
【解决方案2】:
for(int i=3;i<s1.length;i+=6){
   for(int j=0;j<3;j++){
         s1[i+j]; // here is your element
    }
}

只需调整循环条件,如果 arrag 大小不能被 6 整除,您可能会得到 IndexOutOfBoundsException

【讨论】:

    【解决方案3】:

    您可以使用 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());
    

    【讨论】:

      【解决方案4】:

      只是详细说明安东尼奥斯给出的答案,让它给你想要的结果。

      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;
          }
      }
      

      【讨论】:

        【解决方案5】:

        这是我的使用方法:

        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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-06-21
          • 2023-03-13
          • 2012-11-20
          • 1970-01-01
          • 2021-02-23
          • 2021-04-07
          • 2011-07-25
          相关资源
          最近更新 更多