2011-12-08 31 views
64

Đối với một ứng dụng Android, tôi đã sau chức năngCách tốt hơn để tìm chỉ mục của mục trong ArrayList?

private ArrayList<String> _categories; // eg ["horses","camels"[,etc]] 

private int getCategoryPos(String category) { 
    for(int i = 0; i < this._categories.size(); ++i) { 
     if(this._categories.get(i) == category) return i; 
    } 

    return -1; 
} 

Đó có phải là cách "tốt nhất" để viết một hàm để nhận vị trí của một nguyên tố? Hoặc là có một chức năng bản địa shmancy ưa thích trong java tôi nên tận dụng?

+1

Mã này có khả năng bị mắc lỗi: sử dụng của '== 'sẽ mang lại kết quả không chính xác trong hầu hết các trường hợp. –

+3

Hãy nhớ rằng, bạn không thể so sánh chuỗi với '==', bạn phải sử dụng String.equals (String str) – MrZander

+5

@MrZander Chắc chắn bạn có thể so sánh chúng với '==' ... nó không phải là loại phù hợp so sánh ;-) –

Trả lời

147

ArrayListindexOf() method. Kiểm tra API để biết thêm, nhưng dưới đây là cách hoạt động của API:

private ArrayList<String> _categories; // Initialize all this stuff 

private int getCategoryPos(String category) { 
    return _categories.indexOf(category); 
} 

indexOf() sẽ trả về chính xác phương thức của bạn trả về, nhanh chóng.

+2

Đó không phải là "nhanh" về độ phức tạp so với mã được đăng, mặc dù nó có thể được triển khai hiệu quả hơn. Ngoài ra, indexOf sẽ phản ứng hơi khác ở đây: mã ban đầu [không chính xác] sử dụng '==' trong khi indexOf sử dụng 'equals()'. –

+0

Trong thực tế, nó gần như cùng một mã chính xác (ít nhất là trong mã Sun Java 6 tôi có), ngoại trừ việc chúng bắt đầu nó với một nhánh if-else khác xử lý null một cách riêng biệt. – yshavit

+0

Đó là mảng cũ có dây và Danh sách <> có phương thức FindIndex() nhưng thay đổi API ở giữa cho ArrayList: D – boctulus

3

Có thực sự là một chức năng bản địa shmancy ưa thích trong java bạn nên tận dụng.

ArrayList có một phương pháp dụ gọi

indexOf(Object o)

(http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html)

bạn sẽ có thể gọi nó là trên _categories như sau:

_categories.indexOf("camels")

tôi không có kinh nghiệm với progr amming cho Android - nhưng điều này sẽ làm việc cho một ứng dụng Java chuẩn.

Chúc may mắn.

+1

hàm gốc ngụ ý C \ C++ đối với tôi..Chỉ cần nói. –

2

API Java chỉ định hai phương pháp bạn có thể sử dụng: indexOf(Object obj)lastIndexOf(Object obj). Người đầu tiên trả về chỉ mục của phần tử nếu tìm thấy, -1 ngược lại. Thứ hai trả về chỉ mục cuối cùng, sẽ giống như tìm kiếm danh sách ngược.

6

Nếu số List của bạn được sắp xếp và có quyền truy cập ngẫu nhiên tốt (như ArrayList), bạn nên xem Collections.binarySearch. Nếu không, bạn nên sử dụng List.indexOf, như những người khác đã chỉ ra.

Nhưng thuật toán của bạn là âm thanh, fwiw (khác với số == người khác đã chỉ ra).

11
ArrayList<String> alphabetList = new ArrayList<String>(); 
alphabetList.add("A"); // 0 index 
alphabetList.add("B"); // 1 index 
alphabetList.add("C"); // 2 index 
alphabetList.add("D"); // 3 index 
alphabetList.add("E"); // 4 index 
alphabetList.add("F"); // 5 index 
alphabetList.add("G"); // 6 index 
alphabetList.add("H"); // 7 index 
alphabetList.add("I"); // 8 index 

int position = -1; 
position = alphabetList.indexOf("H"); 
if (position == -1) { 
    Log.e(TAG, "Object not found in List"); 
} else { 
    Log.i(TAG, "" + position); 
} 

Output: Danh sách Index:

Nếu bạn vượt qua H nó sẽ trở lại , nếu bạn vượt qua J nó sẽ trở lại -1 như chúng ta định nghĩa giá trị mặc định là -1.

Done

Các vấn đề liên quan