2011-09-06 73 views
5

Tôi đang đọc trong một loại tệp .csv giống như một bảng tính trong excel. Có một số cột nhất định, được xác định bởi tệp và tôi đọc từng dòng vào một mảng chuỗi bằng cách sử dụng phương thức .split(","). Sau đó tôi đặt nó vào một danh sách mảng để nó có thể giữ tất cả các mảng chuỗi mà không cần cho nó một kích thước cụ thể. Tuy nhiên, khi tôi sắp xếp danh sách mảng bằng cách sử dụng Collections.sort(), chương trình sẽ bị ngắt. Vấn đề có thể là gì? Đây là mã của tôi để sắp xếp:Sắp xếp danh sách mảng chuỗi [] mảng

Collections.sort(stringList, new Comparator <String[]>() { 
    public int compare(String[] strings, String[] otherStrings) { 
     return -1 * (strings[sortNum].compareTo(otherStrings[sortNum])); 
    } 
}); 
+1

Trường hợp nào 'sortNum' đến từ đâu? –

+2

Bạn có ý gì khi "nghỉ"? Nó đâu rồi? lỗi gì bạn nhận được? Bạn đã mong đợi điều gì xảy ra? Có phải mỗi hàng có 'ô sortNum' + 1 không? –

+0

'sortNum' là gì? – guardianpt

Trả lời

5

Hai điểm:

  • Đừng nhân là kết quả của compare bởi -1 để đảo ngược một sự so sánh. Integer.MIN_VALUE * -1 vẫn là Integer.MIN_VALUE. Thay vào đó, hãy đảo ngược thứ tự của so sánh chính nó
  • Tôi đoán rằng bạn đã thực sự có một số hàng không có đủ cột. Có lẽ bạn nên đặt những người ở cuối?

Cái gì như:

Collections.sort(stringList, new Comparator <String[]>() { 
    public int compare(String[] x1, String[] x2) { 
     if (x1.length > sortNum && x2.length > sortNum) { 
      return x2[sortNum].compareTo(x1[sortNum]); 
     } 
     if (x1.length > sortNum) { 
      return 1; 
     } 
     if (x2.length > sortNum) { 
      return -1; 
     } 
     return x2.length - x1.length; 
    } 
}); 

Ngoài ra, lọc danh sách của bạn đầu tiên thực hiện hoàn toàn chắc chắn rằng tất cả các hàng có đủ cột.

+0

Điều này làm việc rất đẹp. Cảm ơn bạn – nathpilland

1

Vâng, một trong hai chuỗi [sortNum] hoặc otherStrings [sortNum] có thể nằm ngoài giới hạn. Bạn cần phải làm một số kiểm tra để ngăn chặn điều đó. Ngoài ra, các chuỗi [sortNum] hoặc otherStrings [sortNum] có thể là null. Tôi đặt cược bạn đang chạy vào một trong 2 điều này. Ngăn xếp cuộc gọi chỉ ra điều gì?

0

Tôi nghi ngờ bạn có thể gặp sự cố đóng cửa liên quan đến biến 'sortNum'. Xem Jon Skeet's closure article để biết một số hướng dẫn, mặc dù nó đề cập đến việc đóng cửa trong C# nó vẫn phải có liên quan. Ngay cả khi bạn không có vấn đề này, đó là một đọc tốt. :)

0

bạn có thể cung cấp các giá trị mặc định cho "tế bào" trống rỗng:

  public int compare(String[] strings, String[] otherStrings) { 
       String one, other; 
       one = other = ""; // default value 
       if (sortNum<strings.length && strings[sortNum] != null) { 
        one = strings[sortNum]; 
       } 
       if (sortNum<otherStrings.length && otherStrings[sortNum] != null) { 
        other = otherStrings[sortNum]; 
       } 
       return -1 * (one.compareTo(other)); 
      } 
1

Hãy thử sử dụng

đầu tiên so sánh lớp học của bạn này với một constructor:

public class MyStringArrayComparator implements Comparator<String[]>{ 

     Integer sortNum; 

     public MyStringComparator(Integer index) { 
       sortNum = index; 
     } 

     @Override 
     public int compare(String[] strings, String[] otherStrings) { 
       return -1*(strings[sortNum].compareTo(otherStrings[sortNum])); 
     } 
} 

và trong mã của bạn

Collections.sort(stringList,new MyStringArrayComparator<String[]>(index)); 

Hy vọng hoạt động cho bạn

0

Mã chia sẻ trong trường hợp ai đó cần thực hiện sắp xếp trên nhiều cột.

public final class ArrayComparatorWithIndex<T extends Comparable<T>> implements Comparator<T[]> 
{ 
    private final int[] indexToSort; 

    public ArrayComparatorWitIndex(int[] indexToSort) 
    {   
     if(indexToSort == null || indexToSort.length == 0){ 
      throw new IllegalArgumentException("Index to use for sorting cannot be null or empty."); 
     } 
     this.indexToSort = indexToSort; 
    } 

    @Override 
    public int compare(T[] str, T[] otherStr) 
    { 
     int result= 0; 
     for (int index : indexToSort) 
     { 
      result= str[index].compareTo(otherStr[index]); 
      if (result != 0){ 
       break; 
      } 
     } 
     return result; 
    } 
} 

//Example how to use it: 
int[] indexForSorting= new int[] { 1, 3 }; 
Collections.sort(stringList, new ArrayComparator<String>(indexForSorting)); 
Các vấn đề liên quan