2015-12-01 25 views
5

Tôi có một danh sách chuỗi ký tự với một số giá trị null và một số chuỗi. Tôi không muốn sắp xếp các arraylist nhưng tôi nên sắp xếp các arraylist như vậy mà giá trị null đến cuối cùng. Cho phép nói arraylist là {1,2,null,6,5,null, 3}, tôi sẽ nhận được giá trị null cuối cùng {1,2,6,5,3,null,null}.Sắp xếp chuỗi giá trị null

Giải pháp, hiện tại tôi đang có: Ngay bây giờ, tôi đang xây dựng danh sách mới và Nếu giá trị là null, tôi không đẩy nó vào danh sách mới nếu không tôi sẽ thêm nó vào danh sách mới.

Bất kỳ giải pháp nào khác tốt hơn?

Cảm ơn sự giúp đỡ.

+0

gửi mã về những gì bạn đã cố gắng cho đến nay –

+5

Xây dựng riêng của bạn * so sánh * và thông qua đó để các sorter . – Bathsheba

+0

Cách tiếp cận của bạn có vẻ tốt, vì bạn không muốn thực sự sắp xếp Danh sách. Bạn chỉ cần lặp qua Danh sách một lần. Bạn có thể sửa đổi Danh sách ban đầu nếu bạn muốn tạo danh sách mới hơn (bất cứ khi nào bạn gặp phải giá trị null, hãy xóa nó). – Eran

Trả lời

0

Điều gì về việc xây dựng danh sách mảng mới và nếu nó là giá trị thực, hãy thêm nó vào danh sách mới và nếu nó là một số gia tăng null thì cuối cùng, hãy thêm số lượng null bằng giá trị bộ đếm.

8

Nếu bạn đang sử dụng Java 8, bạn có thể dễ dàng xây dựng các so sánh bạn cần:

Arrays.sort(stringArray, Comparator.nullsLast(Comparator.naturalOrder())); 

Nhưng nếu bạn không sử dụng java 8 bạn có thể có một so sánh như dưới đây

public class StringNullComparator implements Comparator<String> { 
    public int compare(String stringOne, String stringTwo) { 
     if (stringOne != null && stringTwo != null) 
      return stringOne.compareTo(stringTwo); 
     return (stringOne == stringTwo)?0:(stringOne==null? 1 : -1); 
    } 
} 

Và bạn có thể sử dụng tại nêu dưới đây

Arrays.sort(stringArray, new StringNullComparator()); 
1

Nếu bạn muốn tránh lặp lại rõ ràng trên toàn bộ danh sách bạn có thể sử dụng ArrayList.indexOf() để tìm các giá trị null, sau đó remove() chúng. Nếu bạn muốn giữ các giá trị trong danh sách, bạn có thể chỉ cần thêm một giá trị null vào cuối danh sách. Tuy nhiên tôi sẽ tưởng tượng cách tiếp cận này là không lớn về hiệu suất nếu đây là một mối quan tâm.

5

Tuỳ sánh để vượt qua để sắp xếp:

public class StringComparator implements Comparator<String> { 
    public int compare(String s1, String s2) { 
     if (s1 != null && s2 != null) 
      return s1.compareTo(s2); 
     return (s1 == null) ? 1 : -1; 
    } 
} 

thì:

Collectios.sort(list, new StringComparator()); 
0

Nếu bạn muốn sắp xếp rỗng đến cùng và giữ trật tự cho các yếu tố không null Comparator này sẽ làm điều đó:

class CompareStrings implements Comparator<String> { 

    @Override 
    public int compare(String o1, String o2) { 
     if (o1 == null && o2 != null) 
      return 1; 
     if (o2 == null && o1 != null) 
      return -1; 
     return 0; 
    } 
} 

Nếu cả hai String là null hoặc không null họ sẽ so sánh bằng nhau. Nếu chỉ có một là null, nó sẽ so sánh nhỏ hơn giá trị không rỗng.

0

Làm thế nào về:

class MyInteger implements Comparator<Integer> { 
    public int compare(Integer arg0, Integer arg1) { 
     if(arg1 == null) { 
      return -1; 
     } 
     return 0; 
    } 
} 

Và chúng ta có thể sử dụng nó như:

List<Integer> al = new ArrayList<Integer>(); 
al.add(1); 
al.add(2); 
al.add(null); 
al.add(6); 
al.add(5); 
al.add(null); 
al.add(3); 

Collections.sort(al, new MyInteger()); 
0

Tất cả các giải pháp khác liên quan đến phân loại. Như bạn đã đề cập, bạn không thực sự cần phân loại.Trong trường hợp thời gian phức tạp là một mối quan tâm, bạn có thể sử dụng giải pháp thời gian tuyến tính sau đây (tại chỗ):

public static <T> void nullsToEndInPlace(List<T> l) { 
    int i = 0; 
    int j = l.size() - 1; 
    while (i < j) { 
     T left = l.get(i); 
     T right = l.get(j); 
     if (left != null) { 
     i++; 
     } else if (right == null) { 
     j--; 
     } else { 
     l.set(i, right); 
     l.set(j, null); 
     i++; 
     j--; 
     } 
    } 
    } 
Các vấn đề liên quan