Cách tốt hơn để tìm chỉ mục của mục trong ArrayList?


89

Đối với ứng dụng Android, tôi có chức năng sau

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 phần tử không? Hoặc có một hàm gốc shmancy ưa thích trong java mà tôi nên tận dụng?


2
Mã này có thể có sai sót: việc sử dụng ==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ó chỉ không đúng loại so ;-)

Bạn có thể nói rằng tôi vẫn còn mới đối với Java .. String.equalsgiống như ===ngôn ngữ có thể có trong ngôn ngữ như JavaScript? ví dụ. kiểm tra giá trị và kiểu AND?
Jacksonkr

3
Không. ==đối tượng-nhận dạng và nó có nghĩa là "là cùng một đối tượng" . (Chế độ xem này đúng với các giá trị nguyên thủy cũng như các kiểu tham chiếu, nếu bạn cho rằng chỉ có một số có giá trị 42 hoặc char 'x', v.v.). Object.equalslà một phương thức ảo được định nghĩa cho tất cả các trường hợp đối tượng và nó có nghĩa là "có cùng giá trị" , vì tất cả các loại lớp đều mở rộng Đối tượng và nên được sử dụng cho tất cả các bài kiểm tra bình đẳng đối tượng . Có rất nhiều câu hỏi tại cover ==vs Object.equalsvà đây là một khái niệm rất quan trọng để hiểu! Ví dụ, điều này là sai "hello" == new String("hello"):! Doh!

Câu trả lời:


192

ArrayListcó một indexOf()phương pháp . Kiểm tra API để biết thêm, nhưng đây là cách nó hoạt động:

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 những gì phương thức của bạn trả về, nhanh chóng.


3
Nó không "nhanh" về độ phức tạp hơn mã đã đă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ã gốc [không chính xác] sử dụng ==trong khi indexOf sử dụng equals().

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

Nó có dây mảng cũ và List <> có FindIndex () phương pháp nhưng những thay đổi API ở giữa cho ArrayList: D
boctulus

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

Đầu ra: Danh sách Index: 7

Nếu bạn vượt qua H, nó sẽ trả về 7 , nếu bạn vượt qua J, nó sẽ trả về -1 vì chúng tôi đã xác định giá trị mặc định là -1.

Làm xong


Làm thế nào tôi có thể làm cho điều này ngược lại, đối với giải pháp của bạn, đầu vào của bạn là H và bạn nhận được vị trí của H , Giả sử nếu đầu vào của tôi là Chỉ số của 7 làm thế nào tôi có thể nhận được giá trị Chuỗi của chỉ mục đó. Thank You
Jimale Abdi

1
@JimaleAbdi Thực hiện yourArrayList.get (7). 7 là vị trí của bạn.
Hiren Patel

6

Nếu của bạn Listđược sắp xếp và có quyền truy cập ngẫu nhiên tốt (như ArrayListvậy), bạn nên xem xét 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 những thuật toán ==khác đã chỉ ra).


3

Thực sự có một hàm gốc shmancy ưa thích trong java mà bạn nên tận dụng.

ArrayList có một phương thức thể hiện được gọi là

indexOf(Object o)

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

Bạn có thể gọi nó _categoriesnhư sau:

_categories.indexOf("camels")

Tôi không có kinh nghiệm về lập trình cho Android - nhưng điều này sẽ hoạt động đối với một ứng dụng Java tiêu chuẩn.

Chúc may mắn.


1
hàm bản địa ngụ ý C \ C ++ với tôi..Chỉ cần nói.
Hunter McMillen

3

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


1

Cách tốt nhất để tìm vị trí của mục trong danh sách là sử dụng giao diện Bộ sưu tập,

Ví dụ,

List<Integer> sampleList = Arrays.asList(10,45,56,35,6,7);
Collections.binarySearch(sampleList, 56);

Đầu ra: 2


1

Sử dụng phương thức indexOf () để tìm lần xuất hiện đầu tiên của phần tử trong tập hợp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.