2013-04-21 13 views
11

Tôi mới sử dụng java và tôi không thực sự biết cách sử dụng giao diện so sánh. Tôi có một số ArrayList trong số Item s trong một lớp học Inventory và một lớp Item. Trong lớp Item tôi đã viết:Cách sử dụng giao diện Comparator

public class Item implements Comparator<Item> { 
    //stuff 
    ... 
    @Override 
    public int compare(Item a, Item b) { 
     if (a.getID().compareToIgnoreCase(b.getID())>0) 
      return 1; 
     else if (a.getID().compareToIgnoreCase(b.getID())<0) 
      return -1; 
     else 
      return 0; 
    } 
} 

Phương pháp getId() chỉ cung cấp cho các id, mà tôi phải sử dụng để alphabetize các mục. Tôi không chắc chắn nếu điều này là đúng, nó làm cho tôi đặt chú thích @Override, tôi không chắc chắn lý do tại sao. Ngoài ra tôi đã viết một giao diện chỉ nói:

public interface Comparator<Item> 
{ 
    int compare(Item a, Item b); 
} 

Tôi không chắc chắn về điều đó. Ngoài ra, làm cách nào để triển khai phương thức này để sắp xếp danh sách được tạo trong lớp khoảng không quảng cáo?

Cảm ơn, nếu câu hỏi của tôi không có ý nghĩa hoặc cần làm rõ chỉ cho tôi biết.

+0

Đợi, lớp 'Item' của bạn thực hiện' Comparator', mà theo định nghĩa của nó đòi hỏi một 'Item' chung để làm việc. Có vẻ như bạn không cần giao diện chung ở đây ... – Kroltan

+0

Bạn có ý nghĩa gì với giao diện chung? – bassandguitar

+0

Tôi không biết cách giải thích ... https://www.google.com/search?btnG=1&pws=0&q=generics+in+java – Kroltan

Trả lời

10

Để sử dụng giao diện Comparator bạn phải thực hiện nó và vượt qua nó như một lớp vô danh với Collections.sort(List list, Comparator c) như tham số thứ hai.

Nếu bạn chỉ muốn chuyển danh sách tới Collections.sort(List list) thì lớp Item của bạn phải triển khai giao diện Comparable.

Vì vậy, trong cả hai trường hợp, các Collections.sort phương pháp biết làm thế nào để đặt hàng các yếu tố trong danh sách của bạn

đây là một số mẫu mã:

mục lớp thực hiện Comparable + Hàng tồn kho giữ một danh sách các mục

public class Item implements Comparable<Item> { 

    String id = null; 

    public Item(String id) { 
     this.id = id; 
    } 

    @Override 
    public String toString() { 
     return id; 
    } 

    @Override 
    public int compareTo(Item o) { 
     return - id.compareToIgnoreCase(o.id); 
    } 
} 


public class Inventory { 

    List<Item> items = new ArrayList<>(); 

    public void addItem(Item item) { 
     items.add(item); 
    } 

    public static void main(String[] args) { 
     Inventory inventory = new Inventory(); 
     inventory.addItem(new Item("2")); 
     inventory.addItem(new Item("4")); 
     inventory.addItem(new Item("1")); 
     inventory.addItem(new Item("7")); 

     Collections.sort(inventory.items, new Comparator<Item>() { 
      @Override 
      public int compare(Item o1, Item o2) { 
       return o1.id.compareToIgnoreCase(o2.id); 
      } 
     }); 
     System.out.println(inventory.items); 

     Collections.sort(inventory.items); 
     System.out.println(inventory.items); 

    } 
} 

Đầu ra

[1, 2, 4, 7] // ascending 
[7, 4, 2, 1] // descending since the compareTo method inverts the sign of the comparison result. 
0

Bạn đã thực hiện giao diện sai, bạn muốn Comparable

+0

Vui lòng chỉ ra cách 'So sánh' được sử dụng. – MathSquared

3

Bạn đang trộn lên các giao diện ComparatorComparable.

sánh: http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html

tương đương: http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html

Mục đích của Comparator là một lớp (tuyên bố nặc danh ngay tại chỗ hay cách khác) mà có thể được chuyển đến một hoạt động mà cần một trật tự, và nó xác định sắp xếp sẽ được sử dụng trên mục. Phép so sánh sẽ được sử dụng bên ngoài của lớp cần phân loại, nếu có cách thay thế bạn muốn sắp xếp nó theo.

Mục đích của Comparable là để nói rằng lớp (thực hiện Comparable) có thứ tự tự nhiên - và đây là nó là gì. Nếu lớp học của bạn cần phân loại có thứ tự tự nhiên, sau đó xác định nó là Có thể so sánh. (Một lớp học mà thực hiện thứ tự sắp xếp tương đương vẫn có thể được overriden bởi một sánh Mặt khác, nếu lớp không phải là tương đương hơn cũng đi qua một Comparator là bắt buộc để đặt hàng để thực hiện được..)

+0

Tất cả những gì tôi biết là tôi phải sử dụng Comparator trên lớp item, làm cách nào để sử dụng so sánh được với class inventory? – bassandguitar

+2

@bassandguitar Bạn sai - 'Item' sẽ thực hiện' Comparable', OR 'Inventory' sẽ chấp nhận một' Comparator' mà nó sẽ sử dụng để phân loại 'Item' của nó. – Patashu

+0

Tôi sẽ sử dụng phương thức compareTo() để sắp xếp mảng trong lớp khoảng không quảng cáo như thế nào? – bassandguitar

16

EDIT: Trước hết, một vài điều:

  1. Chú thích @Override không được bắt buộc. Nếu Eclipse muốn bạn đặt nó lên, đừng lo lắng.
  2. Không viết giao diện So sánh của riêng bạn. Xóa định nghĩa NAO và sử dụng định nghĩa do Java cung cấp. Việc phát minh lại bánh xe có thể vi phạm Quy tắc lập trình máy tính bất thành văn trong khoảng 15 cách khác nhau. Sử dụng import java.util.Comparator; ở đầu mã của bạn (trước công cụ public class) để a) sử dụng phiên bản do Java cung cấp và b) làm cho mã của bạn tương thích với mọi thứ khác tồn tại trên thế giới.

Giao diện Comparator không được sử dụng để tạo ra một lớp mà có thể đặt chính nó trong trật tự. Đây là giao diện Comparable.

Cả hai đều giống nhau, vì vậy tôi sẽ mô tả cả hai ở đây.

java.util.Comparator

Giao diện Comparator, như bạn đã biết, có một phương pháp: compare. Comparator là generic (sử dụng các dấu ngoặc góc <>) và lấy kiểu nó sẽ so sánh bên trong <>. Vấn đề là các bộ so sánh được sử dụng để so sánh các mục của các lớp khác. Ví dụ: tôi có thể tạo một Trình so sánh cho java.lang.Integers trả về giá trị ngược lại của "thứ tự tự nhiên" (cách số nguyên thường được sắp xếp).

Các bộ so sánh được sử dụng chủ yếu để cung cấp cho các đối tượng khác cách sắp xếp các thông số của chúng khi chúng không theo thứ tự tự nhiên. Ví dụ: java.util.TreeSet class có một Trình so sánh cho khả năng sắp xếp của nó.

java.lang.Comparable

Mục đích của so sánh là để so sánh một đối tượng. Nó cũng là chung chung và có loại mà nó có thể được so sánh với. Ví dụ: một Comparable<String> có thể được so sánh với Chuỗi.

So sánh có một phương pháp: compareTo(). Không giống như số compare() của Bộ so sánh, compareTo có một tham số. Nó hoạt động như compare, ngoại trừ nó sử dụng đối tượng gọi là một tham số. Vì vậy, comparableA.compareTo(comparableB) cũng giống như comparator.compare(comparableA, comparableB).

So sánh chủ yếu là thiết lập thứ tự tự nhiên cho các đối tượng và là cách mặc định để so sánh các đối tượng. Vai trò của người so sánh là để ghi đè thứ tự tự nhiên này khi người ta có nhu cầu khác nhau để so sánh hoặc phân loại dữ liệu.

ArrayList Sorting

Để sắp xếp một List, bạn có thể sử dụng phương pháp này đã có sẵn: cuộn xuống để sort trên java.util.Collections class. Một phương thức có một Comparator, cái kia thì không. sort là tĩnh; sử dụng Collections.sort(...), không phải Collections c = new Collections(); c.sort(...). (Collections thậm chí không có một constructor anyway, do đó meh.)

0

Sử dụng @ Override chú thích là một phương thức chuẩn trong các biên tập viên như Eclipse, NetBeans để thông báo cho nhà phát triển rằng ông là trọng/thực hiện lớp phụ huynh/phương thức giao diện. Nó là tùy chọn.

Không triển khai giao diện này trong lớp Hạng mục của bạn. Tạo một lớp mới và triển khai giao diện Comparator.

public class ItemCompare implements Comparator<Item> { 

    @Override 
    public int compare(Item a, Item b) { 
     if (a.getID().compareToIgnoreCase(b.getID())>0) 
      return 1; 
     else if (a.getID().compareToIgnoreCase(b.getID())<0) 
      return -1; 
     return 0; 
    } 
} 

Và sau đó, trong lớp học chính của bạn, làm điều này:

ArrayList al = new ArrayList<Item> 

Collections.sort(al, new ItemCompare()) 
+1

Bạn sai, cả hai Comparator và Comparable là các giao diện. Phần còn lại của câu trả lời của bạn là ok. – Patashu

+0

Ồ, cảm ơn vì đã chỉ ra điều đó. Tôi ngớ ngẩn quá. Một cái gì đó đã trộn lẫn lên. –

+0

Tôi nghĩ rằng tôi hiểu, nhiệm vụ nói để sử dụng phương thức compareTo() mặc dù tôi vừa thấy, tôi sẽ sử dụng nó như thế nào? và vì vậy ItemCompare cần phải là lớp riêng của mình? – bassandguitar