9
votes

Obtenez des mots autour d'une position dans une chaîne

Je voudrais obtenir les mots qui sont autour d'une certaine position dans une chaîne. Par exemple, deux mots après et deux mots avant.

Par exemple, considérez la chaîne: xxx

ceci écrit l'index de l'endroit où le mot "i" est. Mais je veux pouvoir obtenir une sous-chaîne des mots autour de ces postes.

Je veux pouvoir imprimer "John et moi-même" et "et de la randonnée que j'ai deux".

non seulement des chaînes de mots simples devraient pouvoir être sélectionnées. Recherche de "John and" Retourner "Nom est John et j'aime".

Y a-t-il une façon nette et intelligente de faire cela?


2 commentaires

Comment déterminez-vous les mots environnants?


Oui, c'est la question, comment obtenir StartPomy afin que 2 mots exactement avant et 2 mots suivants sont dans la sous-chaîne?


5 Réponses :


11
votes

Mot unique:

Vous pouvez faire l'aide d'utiliser String code> 'S Split () Code> Méthode . Cette solution est O (n) forte>. P> xxx pré>

sortie: p> xxx pré>

Multi-Word : h1>

regex est une solution excellente et propre pour le cas où trouver code> est un multi-mot. En raison de sa nature, cependant, cela manque les cas lorsque les mots correspondent également à trouvent code> strong> (voir l'exemple de ceci ci-dessous). P>

L'algorithme ci-dessous prend soin de tous les cas (toutes les solutions »). N'oubliez pas que, en raison de la nature du problème, cette solution dans le pire des cas est O (n * m) forte> (avec n code> étant STR code> Longueur et M code> Etre Trouver la longueur code> S) sup>. p>

name is John and John and
John and John and I like


0 commentaires

1
votes

Utiliser string.split () pour diviser le texte en mots. Ensuite, recherchez "i" et concaténez les mots ensemble: xxx

Œct oculkt Vous devez vérifier si I-2 est un index valide et utiliser une StringBuffer serait une performance pratique sage, si vous avoir beaucoup de données ...


0 commentaires

1
votes
// Convert sentence to ArrayList
String[] stringArray = sentence.split(" ");
List<String> stringList = Arrays.asList(stringArray);

// Which word should be matched?
String toMatch = "I";

// How much words before and after do you want?
int before = 2;
int after = 2;

for (int i = 0; i < stringList.size(); ++i) {
    if (toMatch.equals(stringList.get(i))) {
        int index = i;
        if (0 <= index - before && index + after <= stringList.size()) {
            StringBuilder sb = new StringBuilder();

            for (int i = index - before; i <= index + after; ++i) {
                sb.append(stringList.get(i));
                sb.append(" ");
            }
            String result = sb.toString().trim();
            //Do something with result
        }
    }
}
This extracts the two words before and after the match. Could be extended to print at most two words before and after and not exactly two words.EDIT Damn.. way to slow and no fancy ternary operators :/

0 commentaires

2
votes

Voici un autre moyen que j'ai découvert à l'aide de RegEx: xxx

sortie: xxx


2 commentaires

Parfait! Maintenant, je peux aussi rechercher des chaînes multi-mots.


Super :) Mettez à jour la regex avec \\ s + partout qui devrait prendre soin de plusieurs espaces.



0
votes
public static void main(String[] args) {
    String str = "Hello my name is John and I like to go fishing and hiking I have two    sisters and one brother.";
    String find = "I";
    int countWords = 3;
    List<String> strings = countWordsBeforeAndAfter(str, find, countWords);
    strings.stream().forEach(System.out::println);
}

public static List<String> countWordsBeforeAndAfter(String paragraph, String search, int countWordsBeforeAndAfter){
    List<String> searchList = new ArrayList<>();
    String str = paragraph;
    String find = search;
    int countWords = countWordsBeforeAndAfter;
    String[] sp = str.split(" +"); // "+" for multiple spaces
    for (int i = 0; i < sp.length; i++) {
        if (sp[i].equals(find)) {

            String before = "";
            for (int j = countWords; j > 0; j--) {
                if(i-j >= 0) before += sp[i-j]+" ";
            }

            String after = "";
            for (int j = 1; j <= countWords; j++) {
                if(i+j < sp.length) after += " " + sp[i+j];
            }
            String searhResult = before + find + after;
           searchList.add(searhResult);
        }
    }
    return searchList;
}

0 commentaires