Le code suivant va imprimer 2
String Word = "bannanas";
String guess = "n";
int index;
System.out.println(
index = Word.indexOf(guess)
);
Je voudrais savoir comment obtenir tous les index de "n" ("suppose") dans la chaîne "bannanas"
Le résultat attendu serait: [2,3,5]
Cela devrait imprimer la liste des positions sans le -1
à la fin qui La solution de Peter Lawrey a eu.
int index = Word.indexOf(guess);
while (index >= 0) {
System.out.println(index);
index = Word.indexOf(guess, index + 1);
}
Cela peut aussi être fait comme une boucle for
:
for (int index = Word.indexOf(guess);
index >= 0;
index = Word.indexOf(guess, index + 1))
{
System.out.println(index);
}
[Remarque: si guess
peut être plus long qu'un seul caractère, il est possible, en analysant la chaîne guess
, de parcourir Word
plus rapidement que les boucles ci-dessus. Le point de référence pour une telle approche est l’algorithme Boyer-Moore . Cependant, les conditions favorables à l’utilisation d’une telle approche ne semblent pas être présentes.]
Essayez ce qui suit (qui n’imprime pas -1 à la fin maintenant!)
int index = Word.indexOf(guess);
while(index >= 0) {
System.out.println(index);
index = Word.indexOf(guess, index+1);
}
String string = "bannanas";
ArrayList<Integer> list = new ArrayList<Integer>();
char character = 'n';
for(int i = 0; i < string.length(); i++){
if(string.charAt(i) == character){
list.add(i);
}
}
Le résultat serait utilisé comme ceci:
for(Integer i : list){
System.out.println(i);
}
Ou sous forme de tableau:
list.toArray();
Avec Java9, on peut utiliser la iterate(int seed, IntPredicate hasNext,IntUnaryOperator next)
comme suit: -
List<Integer> indexes = IntStream
.iterate(Word.indexOf(c), index -> index >= 0, index -> Word.indexOf(c, index + 1))
.boxed()
.collect(Collectors.toList());
System.out.printlnt(indexes);
int index = -1;
while((index = text.indexOf("on", index + 1)) >= 0) {
LOG.d("index=" + index);
}
String Word = "bannanas";
String guess = "n";
String temp = Word;
while(temp.indexOf(guess) != -1) {
int index = temp.indexOf(guess);
System.out.println(index);
temp = temp.substring(index + 1);
}
J'ai eu ce problème aussi, jusqu'à ce que je trouve cette méthode.
public static int[] indexesOf(String s, String flag) {
int flagLen = flag.length();
String current = s;
int[] res = new int[s.length()];
int count = 0;
int base = 0;
while(current.contains(flag)) {
int index = current.indexOf(flag);
res[count] = index + base;
base += index + flagLen;
current = current.substring(current.indexOf(flag) + flagLen, current.length());
++ count;
}
return Arrays.copyOf(res, count);
}
Cette méthode peut être utilisée pour trouver les index de n'importe quel drapeau de n'importe quelle longueur dans une chaîne, par exemple:
public class Main {
public static void main(String[] args) {
int[] indexes = indexesOf("Hello, yellow jello", "ll");
// Prints [2, 9, 16]
System.out.println(Arrays.toString(indexes));
}
public static int[] indexesOf(String s, String flag) {
int flagLen = flag.length();
String current = s;
int[] res = new int[s.length()];
int count = 0;
int base = 0;
while(current.contains(flag)) {
int index = current.indexOf(flag);
res[count] = index + base;
base += index + flagLen;
current = current.substring(current.indexOf(flag) + flagLen, current.length());
++ count;
}
return Arrays.copyOf(res, count);
}
}
En outre, si vous voulez trouver tous les index d'une chaîne dans une chaîne.
int index = Word.indexOf(guess);
while (index >= 0) {
System.out.println(index);
index = Word.indexOf(guess, index + guess.length());
}
Une classe pour séparer des cordes que je suis venu avec. Un court test est fourni à la fin.
SplitStringUtils.smartSplitToShorterStrings(String str, int maxLen, int maxParts)
sera scindé par des espaces sans casser les mots, si possible, et sinon, scindé par des index selon maxLen.
Autres méthodes fournies pour contrôler la division: bruteSplitLimit(String str, int maxLen, int maxParts)
, spaceSplit(String str, int maxLen, int maxParts)
.
public class SplitStringUtils {
public static String[] smartSplitToShorterStrings(String str, int maxLen, int maxParts) {
if (str.length() <= maxLen) {
return new String[] {str};
}
if (str.length() > maxLen*maxParts) {
return bruteSplitLimit(str, maxLen, maxParts);
}
String[] res = spaceSplit(str, maxLen, maxParts);
if (res != null) {
return res;
}
return bruteSplitLimit(str, maxLen, maxParts);
}
public static String[] bruteSplitLimit(String str, int maxLen, int maxParts) {
String[] bruteArr = bruteSplit(str, maxLen);
String[] ret = Arrays.stream(bruteArr)
.limit(maxParts)
.collect(Collectors.toList())
.toArray(new String[maxParts]);
return ret;
}
public static String[] bruteSplit(String name, int maxLen) {
List<String> res = new ArrayList<>();
int start =0;
int end = maxLen;
while (end <= name.length()) {
String substr = name.substring(start, end);
res.add(substr);
start = end;
end +=maxLen;
}
String substr = name.substring(start, name.length());
res.add(substr);
return res.toArray(new String[res.size()]);
}
public static String[] spaceSplit(String str, int maxLen, int maxParts) {
List<Integer> spaceIndexes = findSplitPoints(str, ' ');
List<Integer> goodSplitIndexes = new ArrayList<>();
int goodIndex = -1;
int curPartMax = maxLen;
for (int i=0; i< spaceIndexes.size(); i++) {
int idx = spaceIndexes.get(i);
if (idx < curPartMax) {
goodIndex = idx;
} else {
goodSplitIndexes.add(goodIndex+1);
curPartMax = goodIndex+1+maxLen;
}
}
if (goodSplitIndexes.get(goodSplitIndexes.size()-1) != str.length()) {
goodSplitIndexes.add(str.length());
}
if (goodSplitIndexes.size()<=maxParts) {
List<String> res = new ArrayList<>();
int start = 0;
for (int i=0; i<goodSplitIndexes.size(); i++) {
int end = goodSplitIndexes.get(i);
if (end-start > maxLen) {
return null;
}
res.add(str.substring(start, end));
start = end;
}
return res.toArray(new String[res.size()]);
}
return null;
}
private static List<Integer> findSplitPoints(String str, char c) {
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == c) {
list.add(i);
}
}
list.add(str.length());
return list;
}
}
Code de test simple:
public static void main(String[] args) {
String [] testStrings = {
"123",
"123 123 123 1123 123 123 123 123 123 123",
"123 54123 5123 513 54w567 3567 e56 73w45 63 567356 735687 4678 4678 u4678 u4678 56rt64w5 6546345",
"1345678934576235784620957029356723578946",
"12764444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444",
"3463356 35673567567 3567 35 3567 35 675 653 673567 777777777777777777777777777777777777777777777777777777777777777777"
};
int max = 35;
int maxparts = 2;
for (String str : testStrings) {
System.out.println("TEST\n |"+str+"|");
printSplitDetails(max, maxparts);
String[] res = smartSplitToShorterStrings(str, max, maxparts);
for (int i=0; i< res.length;i++) {
System.out.println(" "+i+": "+res[i]);
}
System.out.println("===========================================================================================================================================================");
}
}
static void printSplitDetails(int max, int maxparts) {
System.out.print(" X: ");
for (int i=0; i<max*maxparts; i++) {
if (i%max == 0) {
System.out.print("|");
} else {
System.out.print("-");
}
}
System.out.println();
}
String input = "GATATATGCG";
String substring = "G";
String temp = input;
String indexOF ="";
int tempIntex=1;
while(temp.indexOf(substring) != -1)
{
int index = temp.indexOf(substring);
indexOF +=(index+tempIntex)+" ";
tempIntex+=(index+1);
temp = temp.substring(index + 1);
}
Log.e("indexOf ","" + indexOF);