2012-12-11 25 views
5

Używam tego kodu, aby uzyskać indeks String w tablicy.coś jak equalsIgnoreCase podczas korzystania z indexOf

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

Problemem tutaj jest, jeśli ciąg w tekstowym jest inna w przypadkujej podobnym String w tablicy. Zwraca -1. W jaki sposób można uczynić go podobnym do equalsIgnoreCase w przypadku porównywania ciągów.

podziękować innego podejścia, gdzie wewnętrznie upewnić się ignorować wypadek

Odpowiedz

1

.

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

Chociaż zmienię ciąg w polu tekstowym na wielkie/małe litery, nie wiem jak to jest w podanej macierzy. –

+0

Ponadto ciągi w tablicy są używane jako autouzupełnienia. Więc nie mogę ich przekonwertować na duże/małe litery (nie będzie dobrze wyglądać w menu rozwijanym). Może być konieczne utworzenie nowej tablicy ze wszystkimi ciągami znaków jako dolnymi/dużymi literami.Ale nie jest to najlepsze podejście. –

+0

Myślę, że byłoby lepiej, wydajność byłaby "O (n)" –

3

Możesz użyć klasy Collator. w Tutaj możesz ustawić różne poziomy dla porównania. możesz zignorować małe i duże litery oraz ustawić określone charakratory języków. Na przykład w języku niemieckim może ustawić ß równy ss.

here's niektóre dokumentalne: Collator class

Edit: here's przykładowy kod dla ciebie

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

Zobacz przykład, to jest to czego szukasz Mam nadzieję, że – SomeJavaGuy

+0

Więc teraz naprawdę zorientowałem się, co chcesz: D ty wystarczy podać oryginalny ciąg i szukany ciąg w oryginale do tej metody, a następnie ponownie wyświetlić indeks ciągu wyszukiwania lub -1 – SomeJavaGuy

+0

, ale ma to na celu uzyskanie indeksu podłańcucha w danym łańcuchu ciąg macierzysty. Moją potrzebą jest pobranie indeksu String z tablicy stringów. bez zmiany kolejności łańcuchów w tablicy. –

3

Można użyć StringUtils klasę biblioteki Apache Commons lub this Jeśli nie chcesz aby pobrać bibliotekę spójrz na source code dla logiki, aby utworzyć metodę. stackoverflow link do korzystania StringUtils

Jeśli chcesz znaleźć indeks String z tablicy ciągów następnie istnieje inna biblioteka ArrayUtils który ma metodę indexOf

oto realizacja 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; 
    } 

ponieważ widzisz, że używa .equals() proponuję ci

1) utwórz niestandardową klasę ciągów znaków

2) dodać go do tablicy

3) zastąpić metodę .equals jak ten

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

+1 za korzystanie z bibliotek! – itshorty

+0

Ale to jest uzyskanie indeksu podciągu w danym ciągu macierzystym –

+0

@ Archie.bpgc czego jeszcze chcesz? –

0

można rozszerzyć ArrayList w ten sposób

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; 
     } 
    } 

ostatecznie:

int n = new StringArrayList(Arrays.asList(Names)).indexOf(textBox.getText()); 
Powiązane problemy