2012-08-28 41 views
6

Làm cách nào để sắp xếp android.util.SparseArray? Ví dụ: Tôi có SparseArray với:
1-2,33
5-1,5
Kết quả:
5-1,5
1-2,33Sắp xếp SparseArray trong Android

Cảm ơn !!!

- CHỈNH SỬA

Tôi đã sử dụng Bản đồ. Cảm ơn vì sự giúp đỡ.

+2

Tại sao bạn sẽ muốn sắp xếp nó? Các phím không thay đổi và 'SparseArray' không thực hiện' Iterable'. – nkr

+2

'Iterable' không quá nhiều vấn đề, nhưng tôi đồng ý rằng nếu mục tiêu là sắp xếp cấu trúc dữ liệu này, các cấu trúc dữ liệu Java phổ biến như một lớp con của' Map' sẽ có ý nghĩa hơn. Không phải để nói rằng bạn không thể sắp xếp một 'SpareArray' một cách mong muốn, nhưng nó làm việc nhiều hơn là sử dụng một giải pháp out-of-the-box. – Tom

+0

@Tom: Có, anh ấy nên sử dụng cấu trúc dữ liệu khác. Ngay cả khi anh ta sắp xếp 'SparseArray', anh ta sẽ không thể nhận được các giá trị theo đúng thứ tự từ nó. – nkr

Trả lời

0

Đánh giá theo mã nguồn cơ bản cho SparseArray.java, bạn sẽ không thể thực hiện điều đó một cách đơn giản bằng cách gọi một phương thức. Tất cả SpareArray là hai mảng ngôn ngữ Java, một trong các loại int và một loại Object. Các mảng đó là các biến cá thể riêng và bạn không thể tham chiếu chúng mà không có Reflection (điều này nguy hiểm vì tên của chúng có thể thay đổi). Một giải pháp tốt có thể là bản địa hóa mã SpareArray trong ứng dụng của bạn và thêm phương thức sort sử dụng các kỹ thuật Java thông thường, tức là Array.sort.

-5

Thu thập khóa/giá trị của bạn vào danh sách.

   List<Integer>keys = Lists.newArrayList(); 
       List<Integer>vals = Lists.newArrayList(); 
    SparseArray<Integer>arr; 
    for(int i =0; i < arr.size();i++){ 
    keys.add(arr.keyAt(i)); 
    values.add(arr.valueAt(i)); 
    } 
    Collections.sort(keys);// sort 
    Collections.sort(vals); 
    // then fill your array again. 
    arr.clear(); 
    //... 
    arr.put() 
+1

Đó chắc chắn là một cách tiếp cận hợp lệ nhưng nguy hiểm từ quan điểm hiệu suất. Bạn đang tạo Danh sách không cần phải tạo và gọi một phương thức đơn giản để lấy một mục mảng. Ngoài ra, kích thước là một phương thức không phải là một trường. – Tom

+6

Điều này chắc chắn sẽ làm hỏng bản đồ các khóa và giá trị. – nkr

5

Nó không phải là rõ ràng nếu bạn yêu cầu một khóa hoặc giá trị được sắp xếp theo thứ tự ...

vì vậy chỉ cần một lưu ý:

Một tìm kiếm nhị phân chỉ hoạt động trên dữ liệu được sắp xếp và SparseArray sử dụng tìm kiếm nhị phân cho mảng khóa (!) được sắp xếp theo the source. Vì vậy, các phím đã được sắp xếp và sẽ không chấp nhận một thứ tự khác như thứ tự từ các giá trị.

2

Sử dụng LinkedHashMap nếu bạn muốn bản đồ để được sắp xếp

Cập nhật:

Bạn có thể sử dụng TreeMap. Nó giữ các mục được sắp xếp theo khóa của chúng (khóa phải thực hiện Comparable).

+1

Tôi cho rằng câu trả lời này là sai. 'LinkedHashMap' không phải là do chính chúng được sắp xếp, nether trên khóa cũng không có giá trị. Theo [tài liệu JavaSE 7] (https://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html) bảo đảm duy nhất được đưa ra là giữ thứ tự lặp lại của các khóa: "[ ...] thường là thứ tự các phím được chèn vào bản đồ (thứ tự chèn) ". Nó không nói gì về việc sắp xếp dữ liệu (hoặc các khóa). – dbm

+1

Những gì Shayan_Aryan có thể có nghĩa là TreeMap chuẩn hoặc một cái gì đó như ConcurrentSkipListMap, xem https://docs.oracle.com/javase/8/docs/api/java/util/AbstractMap.html – Karussell

+0

@Karussell có, cảm ơn. Tôi chính xác có nghĩa là. Tôi đã cập nhật câu trả lời của mình. –

2

Một sửa đổi nhỏ để @ Karussell của chỗ-on Câu trả lời là cũng là tài liệu chính của phương pháp valueAt() cho thấy một trật tự sắp xếp (trên phím):

[...] valueAt(0) sẽ trả về giá trị liên quan với khóa nhỏ nhất và valueAt(size()-1) sẽ trả lại giá trị được liên kết với khóa lớn nhất.

Một mô tả tương tự được đưa ra đối với phương pháp keyAt().

0

Vui lòng kiểm tra giải pháp của tôi, được sắp xếp theo phím:

private static SparseIntArray sFactorsMap = new SparseIntArray();  

    private static void sortMap() { 
     SparseIntArray sortedSparseIntArray = new SparseIntArray(); 
     while (sFactorsMap.size() > 0) { 
      int min = Integer.MAX_VALUE; 
      for (int i = 0; i < sFactorsMap.size(); i++) { 
       if (sFactorsMap.keyAt(i) <= min) { 
        min = sFactorsMap.keyAt(i); 
       } 
      } 
      sortedSparseIntArray.put(min, sFactorsMap.get(min)); 
      sFactorsMap.removeAt(sFactorsMap.indexOfKey(min)); 
     } 
     sFactorsMap = sortedSparseIntArray; 
    }