【问题标题】:Java: How To Grab Each nth Lines From a StringJava:如何从字符串中获取每 n 行
【发布时间】:2011-09-08 21:29:44
【问题描述】:

我想知道如何从字符串中获取每第 n 行,比如每 100 行,字符串中的行用 '\n' 分隔。

这可能是一件很简单的事情,但我真的想不出该怎么做,所以有人有解决方案吗?

非常感谢, 亚历克斯。

更新: 抱歉,我没有很好地解释我的问题。

基本上,假设有一个 350 行的文件。我想抓住每 100 行块的开始和结束。假设每行有 10 个字符长,我会以 2 个单独的数组(包含开始和结束索引)结束,如下所示:

(第 0-100 行)0-1000

(第 100-200 行)1000-2000

(第 200-300 行)2000-3000

(第 300-350 行)3000-3500

那么,如果我想弄乱第二组 100 行 (100-200),我有适合它们的区域。

【问题讨论】:

    标签: java string newline lines


    【解决方案1】:

    您可以使用split() 将字符串拆分为一个数组,然后获取所需的索引,如下所示:

    String[] strings = myString.split("\n");
    int nth = 100;
    for(int i = nth; i < strings.length; i + nth) {
        System.out.println(strings[i]);
    }
    

    【讨论】:

      【解决方案2】:
      String newLine = System.getProperty("line.separator");
      String lines[] = text.split(newLine);
      

      text 是包含整个文本的字符串。

      现在获取nth 行,例如:

      System.out.println(lines[nth - 1]); // Minus one, because arrays in Java are zero-indexed
      

      【讨论】:

        【解决方案3】:

        一种方法是从字符串创建StringReader,将其包装在BufferedReader 中并使用它来读取行。或者,您当然可以在 \n 上拆分以获取线路...

        String[] allLines = text.split("\n");
        List<String> selectedLines = new ArrayList<String>();
        
        for (int i = 0; i < allLines.length; i += 100)
        {
            selectedLines.add(allLines[i]);
        }
        

        这是比使用BufferedReader 更简单的代码,但它确实意味着在内存中拥有完整的拆分字符串(当然,至少是暂时的,以及原始的)。在适应从其他来源(例如文件)读取行方面,它也不太灵活。但如果这就是你所需要的,那很简单:)

        编辑:如果也需要起始索引,它会变得稍微更复杂......但还不错。您可能希望将“开始和行”封装在一个类中,但为了简洁起见:

        String[] allLines = text.split("\n");
        List<String> selectedLines = new ArrayList<String>();
        List<Integer> selectedIndexes = new ArrayList<Integer>();
        
        int index = 0;
        for (int i = 0; i < allLines.length; i++)
        {
            if (i % 100 == 0)
            {
                selectedLines.add(allLines[i]);
                selectedIndexes.add(index);
            }
            index += allLines[i].length + 1; // Add 1 for the trailing "\n"
        }
        

        当然给定起始索引和行,只要加上行长度就可以得到结束索引:)

        【讨论】:

        • 对不起,我没有把这个放在问题中,但是是否可以获得每100行的开始索引和结束索引?
        • @AlexPriceAp:当然——但是你想要它们在哪里?暂时将它们放在单独的 ArrayList 中...
        • 单独的 ArrayList 很好。我想要开始和结束的原因是我可以将它们用作我正在开发的 SyntaxHighlighter 的边界,所以我可以每 100 行(目前)突出显示,因为我正在为移动设备开发它可能很慢有大文件!
        • @Alex:完成 - 但我只包含了开始索引,因为您只需添加长度即可获得结束索引。
        • 对不起,如果我浪费了你的时间,我解释错了我的意图,将更新添加到问题中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-24
        • 1970-01-01
        • 2017-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多