2012-12-11 9 views
5

Sto usando questo codice, per ottenere l'indice di una stringa in una matrice.qualcosa come equalsIgnoreCase durante l'utilizzo di indexOf

int n = Arrays.asList(Names).indexOf(textBox.getText()); 

Il problema è, se la stringa in textBox è diversa in caso alla sua stringa simile nella matrice. Restituisce -1. Come può renderlo simile a equalsIgnoreCase in caso di confronto tra stringhe.

Thank You

risposta

1

Un approccio diverso in cui internamente assicurarsi ignorare caso.

public static int indexOfIgnoreCase(String[] strs, String text){ 

    int n = strs.length; 
    for(int i=0;i<n;i++){ 
     if(strs[i].equalsIgnoreCase(text)) 
     return i; 
    } 
    return -1; 
} 
int n = indexOfIgnoreCase(Names,textBox.getText()); 
+0

Anche se cambio la stringa in textBox in maiuscolo/minuscolo, non so come sia nell'array dato. –

+0

Inoltre le stringhe nell'array vengono utilizzate come AutoCompleti. Quindi non posso convertirli in maiuscolo/minuscolo (non sembra buono nel menu a discesa). Può essere necessario creare una nuova matrice con tutte le stringhe come maiuscole/minuscole.Ma non è l'approccio migliore –

+0

Penso che sarebbe meglio, le prestazioni sarebbero 'O (n)' –

3

È possibile utilizzare la classe Collator. in Qui puoi impostare diversi livelli per il tuo confronto. è possibile ignorare i casi inferiore e superiore e impostare alcuni caratteri specifici per il linguaggio. Ad esempio in tedesco può impostare ß uguale a ss.

here's alcuni documentari: Collator class

Edit: here's un codice di esempio per voi

private int indexOf(String[] original, String search) { 
    Collator collator = Collator.getInstance(); 
    collator.setStrength(Collator.SECONDARY); 
    for(int i = 0;i<original.length;++i) { 
     if(collator.equals(search, original[i])) 
      return i; 
    } 
    return -1; 
} 
+0

Guarda l'esempio, questo è quello che stai cercando spero – SomeJavaGuy

+0

Quindi ora ho capito cosa vuoi: D tu devi solo dare la stringa originale e la stringa che stai cercando nel tuo originale con questo metodo, e ti riporta l'indice della stringa di ricerca, oppure -1 – SomeJavaGuy

+0

Ma questo è per ottenere l'indice di una sottostringa in un dato stringa genitore. La mia necessità è di ottenere l'indice di una stringa da una matrice di stringhe. senza cambiare l'ordine delle stringhe nella matrice. –

3

È possibile utilizzare StringUtils classe di librerie di Apache Commons o this Se non si desidera per scaricare la libreria, guarda su source code per la logica per creare il metodo. Il collegamento stackoverflow per l'utilizzo di StringUtils

Se si vuole trovare l'indice della stringa da array di stringhe poi c'è un'altra libreria ArrayUtils che ha un metodo indexOf

Ecco l'implementazione di indexOf

public static int indexOf(Object[] array, Object objectToFind, int startIndex) { 
     if (array == null) { 
      return INDEX_NOT_FOUND; 
     } 
     if (startIndex < 0) { 
      startIndex = 0; 
     } 
     if (objectToFind == null) { 
      for (int i = startIndex; i < array.length; i++) { 
       if (array[i] == null) { 
        return i; 
       } 
      } 
     } else { 
      for (int i = startIndex; i < array.length; i++) { 
       if (objectToFind.equals(array[i])) { 
        return i; 
       } 
      } 
     } 
     return INDEX_NOT_FOUND; 
    } 

dal momento che puoi vedere che utilizza .equals() Ti suggerisco di

1) creare una classe di stringa personalizzata

2) aggiungere alla matrice

3) sostituire il metodo .equals simili

class StringCustom 
{ 
String string; 
//implement getters and setters 
public String equals(Object o) 
{ 
return this.getString().equalsIgnoreCase(((String)o).getString()); 
} 
} 
+1

+1 per l'utilizzo delle librerie! – itshorty

+0

Ma questo è per ottenere l'indice di una sottostringa in una determinata stringa padre –

+0

@ Archie.bpgc che altro vuoi? –

0

È possibile estendere ArrayList in questo modo

public class StringArrayList extends ArrayList<String> { 
     @Override 
     public boolean contains(Object o) { 
      String paramStr = (String)o; 
      for (String s : this) { 
       if (paramStr.equalsIgnoreCase(s)) return true; 
      } 
      return false; 
     } 

     public int indexOf(Object o) { 
      String paramStr = (String)o; 
      int index = 0; 
      for (String s : this) { 
       if (paramStr.equalsIgnoreCase(s)) return index; 
       index++; 
      } 
      return -1; 
     } 
    } 

fine:

int n = new StringArrayList(Arrays.asList(Names)).indexOf(textBox.getText());