2012-12-11 31 views
5

Tôi đang sử dụng mã này, để lấy chỉ mục của một Chuỗi trong một mảng.giống như equalsIgnoreCase khi sử dụng indexOf

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

Vấn đề ở đây là, nếu String trong textbox là khác nhau trong trường hợp để String tương tự của nó trong mảng. Nó trả về -1. Cách có thể làm cho nó giống như equalsIgnoreCase trong trường hợp so sánh Chuỗi.

Cảm ơn bạn

Trả lời

1

Cách tiếp cận khác trong trường hợp đảm bảo bỏ qua trường hợp.

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

Mặc dù tôi thay đổi Chuỗi trong hộp văn bản thành chữ hoa/chữ thường, tôi không biết làm thế nào nó là trong mảng nhất định. –

+0

Hơn nữa, các Chuỗi trong Mảng được sử dụng làm AutoCompletes. Vì vậy, tôi không thể chuyển đổi chúng vào trường hợp trên/dưới (wont nhìn tốt trong dropdown). Có thể phải tạo một mảng mới với tất cả các chuỗi dưới dạng chữ hoa/thường.Nhưng nó không phải là cách tốt nhất –

+0

Tôi nghĩ rằng điều này sẽ tốt hơn, hiệu suất sẽ là 'O (n) ' –

3

Bạn có thể sử dụng lớp Collator. Ở đây bạn có thể thiết lập các cấp độ khác nhau để so sánh. bạn có thể bỏ qua các trường hợp thấp hơn và trên, và đặt một số ngôn ngữ cụ thể. Trong tiếng Đức ví dụ, nó có thể thiết lập ß bằng ss.

here's một số phim tài liệu: Collator class

Edit: here's một ví dụ mã cho bạn

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

Xem ví dụ, đây là những gì bạn đang tìm kiếm tôi hy vọng – SomeJavaGuy

+0

Vì vậy, bây giờ tôi thực sự tìm ra những gì bạn muốn: D bạn chỉ cần cung cấp cho chuỗi ban đầu, và chuỗi bạn đang tìm kiếm trong bản gốc của bạn để phương pháp này, và nó reutrn bạn chỉ số của chuỗi tìm kiếm, hoặc -1 – SomeJavaGuy

+0

Nhưng điều này là để có được chỉ số của một chuỗi con trong một chuỗi gốc. Nhu cầu của tôi là lấy chỉ mục của một String từ một mảng của chuỗi. mà không thay đổi thứ tự của các chuỗi trong mảng. –

3

Bạn có thể sử dụng StringUtils lớp của Apache commons thư viện hoặc this Nếu bạn không muốn để tải xuống thư viện, hãy xem source code để biết logic để tạo phương thức. Các liên kết stackoverflow cho việc sử dụng StringUtils

Nếu bạn muốn tìm chỉ số của String từ mảng các chuỗi sau đó có một thư viện ArrayUtils trong đó có một phương pháp indexOf

đây của việc thực hiện 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; 
    } 

vì bạn có thể thấy rằng nó sử dụng .equals() Tôi đề nghị bạn

1) tạo một lớp chuỗi tùy chỉnh

2) thêm nó vào mảng

3) ghi đè lên các phương pháp Equals như thế này

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

+1 để sử dụng thư viện! – itshorty

+0

Nhưng điều này là để có được chỉ số của một chuỗi con trong một chuỗi cha cụ thể –

+0

@ Archie.bpgc bạn muốn gì khác? –

0

Bạn có thể mở rộng ArrayList theo cách này

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

Cuối cùng:

int n = new StringArrayList(Arrays.asList(Names)).indexOf(textBox.getText()); 
Các vấn đề liên quan