Как получать (n) слова текста в Java?

Я нуждаюсь в том, чтобы извлечь (n) слова текста в Java для Android, Вашего начала до числа слов, которое показывается ему, слова отделены очевидно местом:

Но который он имел в виду:

  • что удалил излишнее место конца цепи, а именно, если он покончит с местом, это удалило
  • Чтобы уверять, что режется хорошо текст, если он покончит с различным знаком препинания в .?! как например & ; : , замените это на точку.

например, если решается отрезать n слова и Ваше завершение pulvinar & должен будь быть pulvinar.

Мой испытательный стенд:

array strI это ввод текста и strO вот то, что он был бы должен возвращать правильно, если определяется отрезать в 3 слова.

import java.util.*;
import java.util.regex.*;

public class Test {

    public static void main(String[] args) {

        String[] strI = new String[16];
        String[] strO = new String[16];

        strI[0] = "Lorem ipsum dolor.";
        strO[0] = "Lorem ipsum dolor.";

        strI[1] = "Lorem ipsum dolor, amet.";    
        strO[1] = "Lorem ipsum dolor.";

        strI[2] = "Lorem ipsum dolor: amet.";    
        strO[2] = "Lorem ipsum dolor.";

        strI[3] = "Lorem ipsum dolor; amet.";    
        strO[3] = "Lorem ipsum dolor.";

        strI[4] = "Lorem ipsum dolor! amet.";
        strO[4] = "Lorem ipsum dolor!";

        strI[5] = "Lorem ipsum dolor? amet.";
        strO[5] = "Lorem ipsum dolor?";

        strI[6] = "Lorem ipsum dolor3 amet.";
        strO[6] = "Lorem ipsum dolor3.";

        strI[7] = "Lorem: ipsum & dolor, amet.";
        strO[7] = "Lorem: ipsum.";

        strI[8] = "Lorem: ipsum , dolor, amet.";
        strO[8] = "Lorem: ipsum.";

        strI[9] = "Lorem: ipsum . dolor, amet.";
        strO[9] = "Lorem: ipsum.";

        strI[10] = "Lorem ipsum : dolor, amet.";
        strO[10] = "Lorem ipsum.";

        strI[11] = "Lorem: ipsum ; dolor, amet.";
        strO[11] = "Lorem: ipsum.";

        strI[12] = "Lorem ipsum ? dolor, amet.";
        strO[12] = "Lorem ipsum?";

        strI[13] = "Lorem ipsum ! dolor? amet.";
        strO[13] = "Lorem ipsum!";

        strI[14] = "Lorem ipsum dolor .";
        strO[14] = "Lorem ipsum dolor.";

        strI[15] = "Lorem ipsum";
        strO[15] = "Lorem ipsum.";

        System.out.println(strI[0]);

        for (int i=0; i < strI.length;++i) {

            String outResult = getWords(strI[i],3);
            String flagResult = "F";

            if (outResult.equals(strO[i])) flagResult = "T";

            if (flagResult.equals("T")) {
               System.out.println(flagResult + "[" + outResult + "]");
            } else {
               System.out.println(flagResult + "[" + outResult + "] In/out:" + strI[i] + " =>" + strO[i]);
            }
        }


    }

    public static String getWords(String str, int num) {
        String[] words = str.split(" ");
        int total = words.length;
        if (num<0) num = 0;
        if (num>total) num = total;

        String out ="";
        int i;
        for (i=0;i<num-1;++i) {
            out +=  (i==0)? words[i]: " " + words[i];
        }

        //String endChar = words[i].substring(words[i].length() - 1); 

        String endWord = words[i];

        endWord = endWord.replace(".", "");
        endWord = endWord.replace(",", "");
        endWord = endWord.replace(";", "");
        endWord = endWord.replace(":", "");
        endWord = endWord.replace("&", "");

        endWord = endWord.trim() + ".";

        out += " " +  endWord;
        //System.out.println("endChar[" + endChar + "]");
        //comprar la última palabra como termina
        //out += " " + word[i]

        return out.trim();
    }

}

Результаты T = true и F = false

T[Lorem ipsum dolor.]
T[Lorem ipsum dolor.]
T[Lorem ipsum dolor.]
T[Lorem ipsum dolor.]
F[Lorem ipsum dolor!.]
F[Lorem ipsum dolor?.]
T[Lorem ipsum dolor3.]
F[Lorem: ipsum .]
F[Lorem: ipsum .]
F[Lorem: ipsum .]
F[Lorem ipsum .]
F[Lorem: ipsum .]
F[Lorem ipsum ?.]
F[Lorem ipsum !.]
T[Lorem ipsum dolor.]
T[Lorem ipsum.]
5
задан 14.06.2016, 21:50
4 ответа

проблемой были главным образом два, первый, который добавлял конечную точку к любому решению, и ты не опускал те, в которых не было нужно помещать (как когда он заканчивался в ". ", "?" o"!".

Вторая проблема состояла в том, что добавлялось место всегда перед "endWord", это была проблема, когда они были pro пример "Lorem ipsum? боль, amet., так как, отделив их из-за места в цепях, символ"?" он был взят как одинокое слово, и перед тем, как добавлять ее к конечной цепи, добавляли место раньше. Это подлатывает обусловливая, что добавил одинокое место, когда будет иметься более одного характера. Я оставляю тебе уже измененный код и функционируя (по крайней мере с твоими примерами)

 public static String getWords(String str, int num) {
        String[] words = str.split(" ");
        System.out.println("------------------------------------" + words[0]);
        int total = words.length;
        if (num<0) num = 0;
        if (num>total) num = total;

        String out ="";
        int i;
        for (i=0;i<num-1;++i) {
            out +=  (i==0)? words[i]: " " + words[i];
        }

        //String endChar = words[i].substring(words[i].length() - 1); 

        String endWord = words[i];

        endWord = endWord.replace(".", "");
        endWord = endWord.replace(",", "");
        endWord = endWord.replace(";", "");
        endWord = endWord.replace(":", "");
        endWord = endWord.replace("&", "");

        endWord = endWord.trim();
        /* con este if solo se pone el punto al final si no es alguno de los simbolos que 
         * no se deben reemplazar
         */
        if (!endWord.endsWith(".") && !endWord.endsWith("?") && !endWord.endsWith("!") ) {
            endWord += ".";
        } 
        words[i-1] = words[i-1].trim();
        //solo se añade el esapcio antes del punto si no es un simbolo unico
        if (endWord.length() <= 1) {
            out += endWord;
        } else {
            out += " " +  endWord;
        }

        //System.out.println("endChar[" + endChar + "]");
        //comprar la última palabra como termina
        //out += " " + word[i]

        return out.trim();
    }
2
ответ дан 24.11.2019, 14:09
  • 1
    Совершенный Sip, функционирует хорошо во всех примерах, я считаю это хорошим, если кто-то имеет лучше optimizació n и т.д...., что выставил Ваш ответ – Webserveis 14.06.2016, 23:06

Я собственная soluciГіn, возможно оптимизировать используя регулярные выражения...

public static String getWords(String str, int num) {
    String[] words = str.split(" ");
    int total = words.length;
    if (num<0) num = 0;
    if (num>total) num = total;

    String out ="";
    int i;
    for (i=0;i<num-1;++i) {
        out +=  (i==0)? words[i]: " " + words[i];
    }

    String endWord = words[i];
    String endChar = endWord.substring(endWord.length() - 1); 

    //System.out.println("endChar[" + endChar + "]");

    if (endChar.equals(".")) endChar = "";
    if (endChar.equals(",")) endChar = "";
    if (endChar.equals(";")) endChar = "";
    if (endChar.equals(":")) endChar = "";
    if (endChar.equals("&")) endChar = "";

    if ((!endChar.equals("?")) && (!endChar.equals("!"))) endChar += ".";

    //System.out.println("endChar[" + endChar + "]");
    endWord = endWord.substring(0,endWord.length() - 1)  + endChar; 
    endWord = endWord.trim();

    String spaces = (endWord.length()>1)? " ":"";
    endWord =  spaces + endWord;
    out += endWord;


    return out.trim();
}
1
ответ дан 24.11.2019, 14:09
  • 1
    Что хорошо volví или чтобы открывать этот вопрос! – Jorgesys♦ 14.06.2016, 23:12

aquГ - одна soluciГіn используя регулярные выражения:

public static String getWords(String str, int num) {
    String[] array = str.split("\\s+");
    int n = array.length < num ? array.length : num;
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < n; i++) {
        if (i > 0) {
            sb.append(' ');
        }
        sb.append(array[i]);
    }
    String result = sb.toString();
    result = result.replaceAll("(?<=[A-Za-z0-9])\\s*[&,.:;]*$", ".");
    result = result.replaceAll("\\s*([?!])$", "$1");
    return result;
}
1
ответ дан 24.11.2019, 14:09

ВїLas слова случайные?

String[] palabras = formatear(palabrasAleatorias(5));

Восток mГ©todo получает x слова текста.

public String[] palabrasAleatorias(int cantidad) {
    final String DELIMITADOR = " ";
    final List<String> palabras = new ArrayList<>();

    String[] todasPalabras = texto.split(DELIMITADOR);

    for(int i=1; i<=cantidad; i++) {
        palabras.add(todasPalabras[Math.floor(Math.random() * todasPalabras.length)];
    }
    return palabras;
}

И этот mГ©todo форматирует полученные слова заменяя любой знак puntuaciГіn, который он находил бы в конце концов.

public String[] formatear(String[] palabras) {
    List<String> signos = new ArrayList<>();
    Collections.addAll(signos, ",", ";", ":");
    final List<String> formateadas = new ArrayList<>();
    for(String palabra : palabras) {
        palabra = palabra.trim();
        char signo = palabra.charAt(palabra.length() - 1);
        if(signos.contains(String.valueOf(signo))) {
            palabra = palabra.substring(0, palabra.length() - 1) + ".";
            formateadas.add(palabra);
        }
    }
    return formateadas.toArray(new String[]{});
}

mГ©todo String#trim() Удаляет место в стороны текста. Потом только сравни, если Гєltimo характер текста существует в списке signos; если он asГ - тогда он это заменяет точкой.

0
ответ дан 24.11.2019, 14:09
  • 1
    Я заканчиваюсь añ adir má s данные в вопрос, nú морской окунь слов - начала текста к n слова вперед – Webserveis 14.06.2016, 19:48