如何在Java中获取字符串的最后x行?

时间:2017-03-31 06:33:44

标签: java string

我从外部命令(semi-api)得到一些结果并想要解析结果。 我只对结果的最后几行感兴趣。

如何在Java中获取字符串的最后x行?

5 个答案:

答案 0 :(得分:2)

这是一个简单的解决方案:

public static List<String> getLastLines(String string, int numLines) {
    List<String> lines = Arrays.asList(string.split("\n"));
    return new ArrayList<>(lines.subList(Math.max(0, lines.size() - numLines), lines.size()));
}

答案 1 :(得分:1)

提供结果而不解析整个字符串的解决方案:

/**
 * Created by alik on 3/31/17.
 */
public class Main {

    // TODO: Support other EndOfLines, like "\r\n".
    // One way is to just replace all "\r\n" with "\n" and then run the @getLastLines method.
    public static List<String> getLastLines(String string, int numLines) {
        List<String> lines = new ArrayList<>();
        int currentEndOfLine = string.length();
        if (string.endsWith("\n")) {
            currentEndOfLine = currentEndOfLine - "\n".length();
        }
        for (int i = 0; i < numLines; ++i) {
            int lastEndOfLine = currentEndOfLine;
            currentEndOfLine = string.lastIndexOf("\n", lastEndOfLine - 1);
            String lastLine = string.substring(currentEndOfLine + 1, lastEndOfLine);
            lines.add(0, lastLine);
        }
        return lines;
    }

    @Test
    public void test1() {
        String text = "111\n" +
                "222\n" +
                "333\n" +
                "444\n" +
                "555\n" +
                "666\n" +
                "777\n";
        List<String> lastLines = getLastLines(text, 4);
        Assert.assertEquals("777", lastLines.get(lastLines.size() - 1));
        Assert.assertEquals(4, lastLines.size());
    }

    @Test
    public void test2() {
        String text = "111\n" +
                "222\n" +
                "333\n" +
                "444\n" +
                "555\n" +
                "666\n" +
                "777";
        List<String> lastLines = getLastLines(text, 4);
        Assert.assertEquals("777", lastLines.get(lastLines.size() - 1));
        Assert.assertEquals(4, lastLines.size());
    }
}

* Link to github gist

答案 2 :(得分:0)

<强>算法

  • 使用换行符分割输入文本并另存为列表lines
  • 如果需要的行数,linesRequired小于lines的大小,即lineCount
    • 然后将lines的子列表从lineCount - linesRequired返回到lineCount
    • 否则,根据要求抛出异常或返回所有行。

示例实施

private static final String SEPARATOR = "\n";

public static List<String> getLastLines(String string, int numLines) {
    List<String> lines = Arrays.asList(string.split(SEPARATOR));
    int lineCount = lines.size();
    return lineCount > numLines ? lines.subList(lineCount - numLines, lineCount) : lines;
}

答案 3 :(得分:0)

这是另一种可能的解决方案:

public class LastNLines {
    public static List<String> getLastNLines(String inputString, int n) {
        if(n < 0) {
            return new ArrayList<>();
        }
        String[] tmp = inputString.split("(\\n|\\r)+");
        if(n < tmp.length) {
            return Arrays.asList(Arrays.copyOfRange(tmp, tmp.length - n, tmp.length));
        }
        return Arrays.asList(tmp);
    }

    public static void main(String[] args) {
         String myExample =
            "  \n\r\r\n\nsome_text_1  " +
            "\n" +
            "some_text_2\n\n" +
            "\n" +
            "    some_text_3\n\r    " +
            "\n" +
            "some_text_4\n" +
            "\n" +
            "some_text_5\n\n\n";
        List<String> result = LastNLines.getLastNLines(myExample, 2);
        System.out.println(result.toString());
    }
}

此广告会一次按多个new lines进行拆分,因此分割后,此\n\n\n\n\n这样的文字将不包含Strings,结果将为空。

答案 4 :(得分:0)

Java 8 Streams(内存友好)回答。

代码:

BusinessObject