开发者

Java: How To Grab Each nth Lines From a String

I'm wondering how I could grab each nth lines from a String, say each 100, with the lines in the String being seperated with a '\n'.

This is probably a simple thing to do but I really can't think of how to do it, so does anybody have a solution?

Thanks much, Alex.

UPDATE: Sorry I didn't explain my question very well.

Basically, i开发者_StackOverflow中文版magine there's a 350 line file. I want to grab the start and end of each 100 line chunk. Pretending each line is 10 characters long, I'd finish with a 2 seperate arrays (containing start and end indexes) like this:

(Lines 0-100) 0-1000

(Lines 100-200) 1000-2000

(Lines 200-300) 2000-3000

(Lines 300-350) 3000-3500

So then if I wanted to mess around with say the second set of 100 lines (100-200) I have the regions for them.


You can split the string into an array using split() and then just get the indexes you want, like so:

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


String newLine = System.getProperty("line.separator");
String lines[] = text.split(newLine);

Where text is string with your whole text.

Now to get nth line, do e.g.:

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


One approach is to create a StringReader from the string, wrap it in a BufferedReader and use that to read lines. Alternatively, you could just split on \n to get the lines, of course...

String[] allLines = text.split("\n");
List<String> selectedLines = new ArrayList<String>();

for (int i = 0; i < allLines.length; i += 100)
{
    selectedLines.add(allLines[i]);
}

This is simpler code than using a BufferedReader, but it does mean having the complete split string in memory (as well as the original, at least temporarily, of course). It's also less flexible in terms of being adapted to reading lines from other sources such as a file. But if it's all you need, it's pretty straightforward :)

EDIT: If the start indexes are needed too, it becomes slightly more complicated... but not too bad. You probably want to encapsulate the "start and line" in a single class, but for the sake of brevity:

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

Of course given the start index and the line, you can get the end index just by adding the line length :)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜