2015-04-29 34 views
10

Tôi cần một phương pháp để có được trung bình 3 giá trị, tôi nghĩ đây là cơ hội tốt để viết một phương pháp chung vì tôi không thực sự có thực hành đó. Tôi đã viết điều này và nó có vẻ khá thẳng về phía trước, mặc dù tôi nhận được một cảnh báo, nhưng nó có vẻ làm việc tốt, theo các bài kiểm tra của tôi.Phương pháp chung để tìm giá trị trung bình của 3 giá trị

Tôi biết rằng tôi có thể sử dụng tập hợp được sắp xếp vốn có hoặc Collections.sort(), nhưng cách tiếp cận này là để hiểu.

Tôi muốn xác định một vài điều:

  1. Tôi nhận thấy điều này không làm việc nếu tôi cố gắng tuyên bố medianHelper với Arrays.asList(a, b, c) tại sao điều này? Cố gắng tìm kiếm điều này mang lại cho tôi những kết quả không liên quan và nó khó nắm bắt được vì tôi không chắc điều gì đang xảy ra. Tôi nhận được một UnsupportedOperationException, nhưng đây không phải là cách tôi có nó dưới đây.
  2. Tại sao tôi nhận được cảnh báo? Điều gì là sai/mất tích?

Phương pháp sau:

private static <T extends Comparable> T median(T a, T b, T c) { 
    List<T> medianHelper = new ArrayList<>(); 
    T max; 
    T min; 

    medianHelper.add(a); 
    medianHelper.add(b); 
    medianHelper.add(c); 

    if (a.compareTo(b) >= 0) { 
     max = a; 
     min = b; 
    } else { 
     max = b; 
     min = a; 
    } 

    if (max.compareTo(c) == -1) { 
     max = c; 
    } 

    if (min.compareTo(c) >= 0) { 
     min = c; 
    } 

    medianHelper.remove(max); 
    medianHelper.remove(min); 

    return medianHelper.get(0); 
} 
+0

Bạn nhận được cảnh báo nào? – benzonico

Trả lời

12

Bạn chưa giới thiệu một cách chính xác các loại tham số T, như Comparable là chung chung, quá.

Nó nên khá là:

private static <T extends Comparable<? super T>> T median(T a, T b, T c) 

Bên cạnh đó, bạn có thể chỉ loại danh sách medianHelper, vì yếu tố của nó sẽ được Comparable. Vì vậy, phương pháp của bạn có thể được rút ngắn đáng kể vào:

private static <T extends Comparable<? super T>> T median(T a, T b, T c) { 
    List<T> medianHelper = Arrays.asList(a, b, c); 

    Collections.sort(medianHelper); 

    return medianHelper.get(1); 
} 

Lưu ý rằng Arrays.asList() lợi nhuận một danh sách unmodifiable, có nghĩa là bạn không được phép để thêm/gỡ bỏ các yếu tố sau khi nó được tạo ra. Nếu bạn muốn tự mình so sánh, bạn có thể sử dụng new ArrayList<> thay vì Arrays.asList() và sau đó thêm thủ công các phần tử vào đó.

+2

Điều đó thậm chí phải là 'T mở rộng So sánh ' – fge

+0

Thật vậy. Tôi sắp sửa áp dụng bản chỉnh sửa. Cảm ơn. –

+0

Cảm ơn bạn, kocko. Tôi hoàn toàn bỏ qua rằng 'So sánh' là chung chung, và cảm ơn bạn, fge cho sự khác biệt quan trọng mà nó cũng có một ràng buộc trên. Tôi vẫn còn lúng túng về chủ đề của các lỗi Arrays.asList nếu tôi muốn tự mình so sánh. Có suy nghĩ gì không? – Legato

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