2013-05-06 55 views
12

Tôi có một Lớp được gọi là AuctionItem. Lớp AuctionItem có phương thức được gọi là getName() trả về một String. Nếu tôi có ArrayList loại AuctionItem, cách tốt nhất để trả lại chỉ mục của một mục trong ArrayList có tên cụ thể là gì?Lấy chỉ mục của một mục trong danh sách mảng;

Tôi biết rằng có chức năng .indexOf(). Tham số cho hàm này là một đối tượng. Để tìm mục có tên, tôi có nên sử dụng vòng lặp for hay không và khi mục được tìm thấy, hãy trả về vị trí phần tử trong ArrayList?

Có cách nào tốt hơn không?

Trả lời

0

Để tìm mục có tên, tôi có nên sử dụng vòng lặp for hay không và khi mục được tìm thấy, hãy trả về vị trí phần tử trong ArrayList?

Có vòng lặp (sử dụng chỉ mục hoặc Iterator). Trên giá trị trả về, hoặc trả lại chỉ mục của nó hoặc mục đó, tùy thuộc vào nhu cầu của bạn. ArrayList không có indexOf (Mục tiêu đối tượng, Comparator so sánh) `hoặc tương tự. Bây giờ Java đang nhận được các biểu thức lambda (trong Java 8, ~ tháng 3 năm 2014), tôi hy vọng chúng ta sẽ thấy các API nhận các phương thức chấp nhận lambdas cho những thứ như thế này.

9

Yes.you phải vòng lặp nó

public int getIndex(String itemName) 
{ 
    for (int i = 0; i < arraylist.size(); i++) 
    { 
     AuctionItem auction = arraylist.get(i); 
     if (itemName.equals(auction.getname())) 
     { 
      return i; 
     } 
    } 

    return -1; 
} 
5

Về cơ bản bạn cần phải nhìn lên ArrayList yếu tố dựa trên tên getName. Hai phương pháp cho vấn đề này:

1- Không sử dụng ArrayList, Sử dụng HashMap<String,AutionItem> nơi String sẽ được đặt tên

2- Sử dụng getName để tạo chỉ mục và sử dụng chỉ số bổ sung dựa vào danh sách mảng list.add(int index, E element). Một cách để tạo index từ tên sẽ được sử dụng hashCode và modulo của mình bằng ArrayList kích thước hiện tại (một cái gì đó tương tự như những gì được sử dụng bên trong HashMap)

+1

+1 để sử dụng HashMap – Kai

1
for (int i = 0; i < list.length; i++) { 
    if (list.get(i) .getName().equalsIgnoreCase("myName")) { 
    System.out.println(i); 
    break; 
    } 
} 
14

Tôi nghĩ rằng một cho vòng lặp phải là một giải pháp hợp lệ:

public int getIndexByname(String pName) 
    { 
     for(AuctionItem _item : *yourArray*) 
     { 
      if(_item.getName().equals(pName)) 
       return *yourarray*.indexOf(_item) 
     } 
     return -1; 
    } 
0

Bạn có thể triển khai hashCode/equals trong số AuctionItem để hai trong số chúng bằng nhau nếu chúng có cùng tên. Khi thực hiện việc này, bạn có thể sử dụng các phương thức indexOfcontains của số ArrayList như sau: arrayList.indexOf(new AuctionItem("The name")). Hoặc khi bạn giả định trong phương thức equals thì một String được truyền: arrayList.indexOf("The name"). Nhưng đó không phải là thiết kế tốt nhất.

Nhưng tôi cũng thích sử dụng HashMap để ánh xạ tên cho mục.

0

Thay vì sử dụng vòng lặp lực ngang qua danh sách (ví dụ 1 đến 10000), thay vì sử dụng phương pháp tìm kiếm lặp lại: Danh sách cần được sắp xếp theo yếu tố cần kiểm tra.

Bắt đầu tìm kiếm ở kích thước nguyên tố giữa()/2 ví dụ 5000 nếu mục tìm kiếm lớn hơn phần tử ở 5000, sau đó kiểm tra phần tử tại trung điểm giữa phía trên (10000) và trung điểm (5000) - 7500

tiếp tục thực hiện việc này cho đến khi bạn đạt được kết quả phù hợp (hoặc sử dụng vòng lặp lực ngang qua khi bạn xuống đến phạm vi nhỏ hơn (ví dụ 20 mặt hàng)

Bạn có thể tìm kiếm danh sách 10000 trong khoảng 13-14 thử nghiệm, thay vì có thể thử nghiệm 9999.

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