Wie Sie abschneiden einer Zeichenkette nach n-Wörter in Java?

Gibt es Bibliothek, eine routine für das abschneiden einer Zeichenfolge nach n Wörter? Ich bin auf der Suche nach etwas, dass können schalten Sie:

truncateAfterWords(3, "hello, this\nis a long sentence");

in

"hello, this\nis"

Könnte ich schreiben es selbst, aber ich dachte, so etwas könnte existieren bereits in einigen open-source-string-manipulation-Bibliothek.


Hier ist eine vollständige Liste der Testfälle, würde ich erwarten, dass jede Lösung zu übergeben:

import java.util.regex.*;

public class Test {

    private static final TestCase[] TEST_CASES = new TestCase[]{
        new TestCase(5, null, null),
        new TestCase(5, "", ""),
        new TestCase(5, "single", "single"),
        new TestCase(1, "single", "single"),
        new TestCase(0, "single", ""),
        new TestCase(2, "two words", "two words"),
        new TestCase(1, "two words", "two"),
        new TestCase(0, "two words", ""),
        new TestCase(2, "line\nbreak", "line\nbreak"),
        new TestCase(1, "line\nbreak", "line"),
        new TestCase(2, "multiple  spaces", "multiple  spaces"),
        new TestCase(1, "multiple  spaces", "multiple"),
        new TestCase(3, " starts with space", " starts with space"),
        new TestCase(2, " starts with space", " starts with"),
        new TestCase(10, "A full sentence, with puncutation.", "A full sentence, with puncutation."),
        new TestCase(4, "A full sentence, with puncutation.", "A full sentence, with"),
        new TestCase(50, "Testing a very long number of words in the testcase to see if the solution performs well in such a situation.  Some solutions don't do well with lots of input.", "Testing a very long number of words in the testcase to see if the solution performs well in such a situation.  Some solutions don't do well with lots of input."),
    };

    public static void main(String[] args){
        for (TestCase t: TEST_CASES){
            try {
                String r = truncateAfterWords(t.n, t.s);
                if (!t.equals(r)){
                    System.out.println(t.toString(r));
                }
            } catch (Exception x){
                System.out.println(t.toString(x));
            }       
        }   
    }

    public static String truncateAfterWords(int n, String s) {
        //TODO: implementation
        return null;
    }
}


class TestCase {
    public int n;
    public String s;
    public String e;

    public TestCase(int n, String s, String e){
        this.n=n;
        this.s=s;
        this.e=e;
    }

    public String toString(){
        return "truncateAfterWords(" + n + ", " + toJavaString(s) + ")\n  expected: " + toJavaString(e);
    }

    public String toString(String r){
        return this + "\n  actual:   " + toJavaString(r) + "";
    }

    public String toString(Exception x){
        return this + "\n  exception: " + x.getMessage();
    }    

    public boolean equals(String r){
        if (e == null && r == null) return true;
        if (e == null) return false;
        return e.equals(r);
    }   

    public static final String escape(String s){
        if (s == null) return null;
        s = s.replaceAll("\\\\","\\\\\\\\");
        s = s.replaceAll("\n","\\\\n");
        s = s.replaceAll("\r","\\\\r");
        s = s.replaceAll("\"","\\\\\"");
        return s;
    }

    private static String toJavaString(String s){
        if (s == null) return "null";
        return " \"" + escape(s) + "\"";
    }
}

Gibt es Lösungen für diese auf dieser Website in anderen Sprachen:

  • Ich glaube nicht, dass es eine Funktion wie diese, die Aussehen wie etwas ganz besonderes.
  • Sie können die Verwendung von split(), split-Worte auf " ", und dann zählen Sie Sie auf und wenn Sie mehr als 3, verwerfen Sie den rest. Aber Nein, ich habe noch nie auf etwas gestossen, wie dies bereits gemacht.
  • Ich dachte an split, aber es neigt dazu, um Sie wegzuwerfen, das, was Sie auf Spalten. Ich will bewahren das Leerzeichen und neue Zeilen in der Zeichenfolge.
  • anstelle der Verwendung von String.spilt(), ich würde es vorziehen, zu verwenden Scanner Klasse next(). Als die spilt() . Lesen Sie mehr zu diesem link
  • Meine Antwort unten funktioniert Prima mit Ihr bearbeitet input-string hello, this\nis a long sentence als gut.
  • Wenn es funktioniert, dann vergessen Sie nicht, markieren Sie es akzeptiert, wenn du kannst 😛

Schreibe einen Kommentar