2011-06-20 25 views
9

Tôi muốn điều hướng vào danh sách theo số nhận dạng.Danh sách Java: nhận phần tử tiếp theo hoặc trước từ mã định danh

1- Tôi quản lý/tạo danh sách.

2- Tôi tạo chức năng để nhận mục tiếp theo của phần tử số nhận dạng từ danh sách của tôi

Bạn có thể giúp tôi khắc phục mã này không?

Chuẩn bị danh sách

List<String> myList = new ArrayList<String>(); 
myList.add("1"); 
myList.add("2"); 
myList.add("3"); 
myList.add("4"); 
myList.add("5"); 


public String function getNext(String uid) { 

    if (myList.indexOf(uid).hasNext()) { 
     return myList.indexOf(uid).nextElement(); 
    } 
    return ""; 
} 

public String function getPrevious(String uid) { 
    return myList.indexOf(uid).hasPrevious() ? myList.indexOf(uid).previousElement() : ""; 
} 

Trả lời

10

Bạn có thể sử dụng chỉ mục để tra cứu Chuỗi của mình nhanh hơn và đơn giản hơn để thực hiện các chức năng như bạn có.

public String getNext(String uid) { 
    int idx = myList.indexOf(uid); 
    if (idx < 0 || idx+1 == myList.size()) return ""; 
    return myList.get(idx + 1); 
} 

public String getPrevious(String uid) { 
    int idx = myList.indexOf(uid); 
    if (idx <= 0) return ""; 
    return myList.get(idx - 1); 
} 

Sử dụng List.get(i)O(1) làm cho chỉ mục này trở thành tùy chọn nhanh nhất. List.indexOf(String)O(n). Sử dụng một NavigatbleSet có thể xuất hiện hấp dẫn vì nó là O(log n), tuy nhiên chi phí tạo ra một đối tượng là quá cao mà bộ sưu tập phải được khá lớn trước khi bạn sẽ thấy một lợi ích. (Trong trường hợp này, bạn sẽ sử dụng tùy chọn đầu tiên)

+1

giải pháp rất thanh lịch –

+0

với chỉ báo trước rằng * indexOf * là một hoạt động * O (n) * nhưng, yup, +1. – SyntaxT3rr0r

+0

@ SyntaxT3rr0r, Điểm tốt. Đây là lý do tại sao giữ lại chỉ mục tốt hơn vì 'List.get (int)' là 'O (1)' Nó có thể làm cho mã đơn giản hơn. –

1

Nếu yếu tố bạn không được lặp đi lặp lại, những gì bạn cần là một NavigableSet:

http://download.oracle.com/javase/6/docs/api/java/util/NavigableSet.html

Các phương pháp higherlower là những gì bạn đang tìm kiếm.

+0

NavigableSet mở rộng SortedSet. Đây không phải là những gì OP là sau: NavigableSet sẽ cho anh ta phần tử tiếp theo theo thứ tự sắp xếp, không có thứ tự chèn. OP là sau những gì Peter Lawrey đã đưa ra như một câu trả lời: một phương pháp cho anh ta phần tử tiếp theo/trước đó trong thứ tự chèn. – SyntaxT3rr0r

+0

@ SyntaxT3rr0r Trong các phần tử ví dụ được chèn vào theo thứ tự từ vựng mà không lặp lại, do đó, giả định rằng anh ta đã bỏ lỡ bằng cách sử dụng danh sách khi những gì anh ta thực sự cần là một tập hợp được sắp xếp ... Bạn biết đấy, khi tất cả những gì bạn có là búa, mọi thứ trông giống như móng tay. – fortran

+0

là bạn có nghĩa là cố gắng ám chỉ rằng tất cả các OP biết sẽ là một cái búa? Điều đó sẽ rất thô lỗ. Nó cũng sẽ là mỉa mai rằng bạn - ai biết nhiều hơn chỉ là búa - không biết khi nào sử dụng nhiều hơn búa và khi không. Một câu trả lời không có thật là một câu trả lời không có thật: không cố gắng để xoay này trong lợi của bạn. – SyntaxT3rr0r

1

Danh sách không có phương thức nextElement(). indexOf trả về chỉ số nguyên của mục. Bạn chỉ có thể thêm (hoặc trừ) một để có được những mục tiếp theo (hoặc trước đó):

public String function getNext(String uid) { 
    var index = myList.indexOf(uid); 
    if (index > -1) { 
    try { 
     return myList.get(i+1); 
    } catch (IndexOutOfBoundsException e) { 
     // Ignore 
    } 
    } 
    return ""; // consider returning `null`. It's usually a better choice. 
} 

Tuy nhiên nhìn lên một đối tượng với indexOf trên ArrayList là một quá trình rất chậm, bởi vì nó có để kiểm tra tất cả các mục duy nhất. Có những cách tốt hơn để điều này, nhưng điều đó phụ thuộc vào những gì bạn đang thực sự cố gắng để đạt được.

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