2011-12-15 29 views
5

Tôi muốn giữ các chỉ mục của các mục trong Danh sách Java được cố định.Cách giữ chỉ mục Danh sách được sửa trong Java

Ví dụ mã:

import java.util.ArrayList; 
public class Test { 
    public static void main(String[] args) { 
     ArrayList<Double> a = new ArrayList<Double>(); 
     a.add(12.3); 
     a.add(15.3); 
     a.add(17.3); 

     a.remove(1); 
     System.out.println(a.get(1)); 
    } 
} 

chí này ra 17.3. Vấn đề là 17.3 đã nằm trên chỉ mục 2 và giờ nó đã nằm trong chỉ mục 1!

Có cách nào để bảo toàn các chỉ mục của các thành phần khác khi xóa phần tử không? Hoặc là có một lớp học phù hợp hơn cho mục đích này?

Lưu ý: Tôi không muốn Bộ sưu tập kích thước cố định.

Trả lời

5

Bạn có thể muốn sử dụng java.util.SortedMap với int phím:

import java.util.*; 
public class Test { 

    public static void main(String[] args) 
    { 
     SortedMap<Integer, Double> a = new TreeMap<Integer, Double>(); 
     a.put(0, 12.3); 
     a.put(1, 15.3); 
     a.put(2, 17.3); 

     System.out.println(a.get(1)); // prints 15.3 
     System.out.println(a.get(2)); // prints 17.3 

     a.remove(1); 

     System.out.println(a.get(1)); // prints null 
     System.out.println(a.get(2)); // prints 17.3 
    } 
} 
  • SortedMap là một Bộ sưu tập biến kích thước
  • Nó lưu trữ các giá trị ánh xạ tới một tập có thứ tự các phím (tương tự như List 's chỉ số)

Không triển khai java.util.List#remove(int) có thể bảo toàn các chỉ số vì đặc điểm kỹ thuật đọc:

Xóa phần tử tại vị trí đã chỉ định trong danh sách này (thao tác tùy chọn). Thay đổi bất kỳ phần tử tiếp theo nào sang bên trái (trừ một phần tử từ chỉ mục của chúng). Trả về phần tử đã bị xóa khỏi danh sách.

+1

Và nếu bạn không muốn theo dõi chỉ mục tiếp theo, bạn chỉ có thể phân lớp 'SortedMap' và thêm' công khai V (giá trị V) 'và theo dõi chỉ mục tiếp theo trong nội bộ lớp con. –

5

Thay vì gọi a.remove(1) bạn có thể làm a.set(1, null). Điều này sẽ giữ cho tất cả các phần tử trong cùng một vị trí trong khi vẫn "loại bỏ" giá trị tại chỉ mục một.

+0

theo cách này, tôi nên triển khai Loại danh sách mới, có tiêu chuẩn gì không? – MhdSyrwan

+0

Phương thức thiết lập * là * một phương thức chuẩn của giao diện Danh sách. Xem http://docs.oracle.com/javase/6/docs/api/java/util/List.html#set%28int,%20E%29 –

+0

"bộ" là, chắc chắn, chuẩn, ý tôi là tôi muốn một lớp tiêu chuẩn sử dụng cơ chế này – MhdSyrwan

4

Nếu mối quan hệ phải luôn giống nhau giữa chỉ mục và giá trị thì hãy sử dụng java.util.Map.

2

Thay vì loại bỏ các phần tử với các cuộc gọi để loại bỏ thiết lập các yếu tố để null:

tức là:

import java.util.ArrayList; 
public class Test 
{ 
    public static void main(String[] args) 
{ 
     ArrayList<Double> a = new ArrayList<Double>(); 
     a.add(12.3); 
     a.add(15.3); 
     a.add(17.3); 

     a.set(1, null); 
     System.out.println(a.get(1)); 
    } 
} 
2

Bạn có thể sử dụng một HashMap<Integer, Double>. Bạn có thể thêm các mục sử dụng

myMap.put(currentMaximumIndex++, myDoubleValue); 

Bằng cách này, chỉ số sẽ là duy nhất, nếu bạn cần lưu trữ thưa thớt bạn muốn được hợp lý okay, và loại bỏ một giá trị sẽ không làm tổn thương những cái hiện có.

+0

+1. Đây có vẻ là cách hiệu quả nhất về không gian lưu trữ các giá trị và không thay đổi chỉ mục. – eboix

1

bổ sung câu trả lời trên của nó cũng gợi ý bạn nên sử dụng LinkedHashMap<Integer,Double>, thay vì một HashMap thường xuyên này sẽ giữ lại thứ tự mà bạn chèn phần tử.

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