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: p> 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. P> Je veux pouvoir imprimer "John et moi-même" et "et de la randonnée que j'ai deux". p> 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". P> Y a-t-il une façon nette et intelligente de faire cela? P> P>
5 Réponses :
Vous pouvez faire l'aide d'utiliser sortie: p> regex est une solution excellente et propre pour le cas où 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 String code> 'S . Cette solution est Split () Code> Méthode Multi-Word : h1>
trouver code> est un multi-mot. En raison de sa nature, cependant, cela manque les cas lorsque les mots trouvent code> strong> (voir l'exemple de ceci ci-dessous). P> 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
Utiliser string.split () pour diviser le texte en mots. Ensuite, recherchez "i" et concaténez les mots ensemble: Œ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 ... p> p>
// 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 :/
Voici un autre moyen que j'ai découvert à l'aide de RegEx: sortie: p>
Parfait! Maintenant, je peux aussi rechercher des chaînes multi-mots.
Super :) Mettez à jour la regex avec \\ s + code> partout qui devrait prendre soin de plusieurs espaces.
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;
}
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?