2012-04-04 37 views
27

Tôi đang làm bài tập về nhà và cần một người nào đó đưa tôi đi qua một cái gì đó. Tôi đang học về mảng và về cơ bản tôi có một mảng thu thập họ, tên, và điểm số. Tôi cần phải viết một phương thức compareTo sẽ so sánh họ và sau đó là tên đầu tiên để danh sách có thể được sắp xếp theo thứ tự bảng chữ cái bắt đầu bằng họ và sau đó nếu hai người có cùng họ thì nó sẽ sắp xếp tên.phương thức compareTo java

Tôi đang bối rối vì tất cả thông tin trong sách của tôi là so sánh các số và không phải là đối tượng hoặc tôi đoán Strings? Tôi nghĩ rằng chuỗi được coi là đối tượng khi làm việc với mảng. Điều này thực sự gây nhầm lẫn cho tôi vì vậy nếu một người nào đó có thể hướng dẫn tôi qua nó, tôi sẽ đánh giá cao nó. Đây là những gì tôi đã mã hóa cho đến nay nhưng tôi biết nó sai, nhưng ít nhất nó giải thích những gì tôi nghĩ rằng tôi đang làm.

public int Compare(Object obj) // creating a method to compare 
{ 
    Student s = (Student) obj; //creating a student object 

    // I guess here I'm telling it to compare the last names? 
    int studentCompare = this.lastName.compareTo(s.getLastName()); 

    if (studentCompare != 0) 
     return studentCompare; 
    else 
    { 
     if (this.getLastName() < s.getLastName()) 
      return - 1; 

     if (this.getLastName() > s.getLastName()) 
      return 1; 
    } 
    return 0; 

} 

Tôi biết <> những biểu tượng là sai nhưng cũng giống như tôi đã nói cuốn sách của tôi chỉ cho bạn thấy làm thế nào để chúng ta compareTo phương pháp sử dụng số mà tôi nghĩ là loại không công bằng để mong đợi tôi để hiểu làm thế nào để so sánh các đối tượng.

+0

Nếu bạn chỉ có thể nói 'someString cHao

Trả lời

23

Đây là cách đúng đắn để so sánh chuỗi:

int studentCompare = this.lastName.compareTo(s.getLastName()); 

này thậm chí sẽ không biên dịch:

if (this.getLastName() < s.getLastName()) 

Sử dụng if (this.getLastName().compareTo(s.getLastName()) < 0) để thay thế.

Vì vậy, để so sánh nắm tay/cuối cùng để tên bạn cần:

int d = getFirstName().compareTo(s.getFirstName()); 
if (d == 0) 
    d = getLastName().compareTo(s.getLastName()); 
return d; 
+0

Tôi đồng ý với cách bạn cấu trúc câu lệnh if. Đầu tiên là lỗi. – LatheElHafy

1

if (s.compareTo(t) > 0) sẽ so sánh chuỗi s đến chuỗi t và trả về giá trị int mà bạn muốn.

public int Compare(Object obj) // creating a method to compare { 
     Student s = (Student) obj; //creating a student object 

     // compare last names 
     return this.lastName.compareTo(s.getLastName());  
    } 

Bây giờ, chỉ cần thử nghiệm cho một kết quả dương tính âm từ phương thức như bình thường.

Chúc mừng

1

Bạn gần như đã có mặt ở đó.

Một vài dòng đầu tiên của bạn, so sánh họ, đang đi đúng hướng. Phương thức compareTo() trên chuỗi sẽ trả về một số âm cho một chuỗi theo thứ tự bảng chữ cái trước đây, và một số dương cho một chuỗi theo thứ tự bảng chữ cái sau đó.

Bây giờ, bạn chỉ cần làm điều tương tự cho tên và điểm số của bạn.

Nói cách khác, nếu Last Name 1 == Last Name 2, hãy kiểm tra tên của bạn tiếp theo. Nếu tên đầu tiên giống nhau, hãy kiểm tra điểm số của bạn tiếp theo. (Hãy suy nghĩ về việc lồng nếu/sau đó chặn.)

+0

Vì vậy, bạn có nói rằng tôi không cần mã bắt đầu từ if (studentcompare! = 0) vì dòng ở trên đã trả về số dương và số âm? –

0

Chuỗi là một đối tượng trong Java.

bạn có thể so sánh như vậy,

if(this.lastName.compareTo(s.getLastName() == 0)//last names are the same 
1

Xem xét sử dụng giao diện Comparator mô tả here trong đó sử dụng Generics vì vậy bạn có thể tránh được đúc Object để Student.

Như Eugene Retunsky đã nói, phần đầu tiên của bạn là cách chính xác để so sánh String s. Ngoài ra nếu số lastName s bằng nhau, tôi nghĩ bạn có nghĩa là để so sánh firstName s, trong trường hợp này chỉ sử dụng compareTo theo cách tương tự.

18

Các compareTo phương pháp được mô tả như sau:

So sánh đối tượng này với đối tượng quy định cho đơn đặt hàng. Trả về một số nguyên âm, số không, hoặc số nguyên dương là hơn, bằng hoặc lớn hơn đối tượng được chỉ định.

Hãy nói rằng chúng tôi muốn so sánh Jedis theo độ tuổi của họ:

class Jedi implements Comparable<Jedi> { 

    private final String name; 
    private final int age; 
     //... 
} 

Sau đó, nếu Jedi của chúng tôi là lớn tuổi hơn được cung cấp một, bạn phải trả lại một tích cực, nếu họ cùng tuổi, bạn trả về 0, và nếu Jedi của chúng ta nhỏ hơn bạn trả về một âm.

public int compareTo(Jedi jedi){ 
    return this.age > jedi.age ? 1 : this.age < jedi.age ? -1 : 0; 
} 

Bằng cách thực hiện các phương pháp compareTo (đến từ giao diện Comparable) của bạn được xác định những gì được gọi một trật tự tự nhiên. Tất cả các phương thức sắp xếp trong JDK sẽ sử dụng thứ tự này theo mặc định.

Có các ocassions mà bạn có thể muốn căn cứ so sánh của bạn trong các đối tượng khác, chứ không phải trên một kiểu nguyên thủy. Ví dụ, coped Jedis dựa trên tên của họ. Trong trường hợp này, nếu các đối tượng được so sánh đã triển khai Comparable thì bạn có thể thực hiện so sánh bằng phương pháp compareTo của nó.

public int compareTo(Jedi jedi){ 
    return this.name.compareTo(jedi.getName()); 
} 

Sẽ đơn giản hơn trong trường hợp này.

Bây giờ, nếu bạn bắt đầu sử dụng cả tên và độ tuổi làm tiêu chí so sánh thì bạn phải quyết định so sánh so sánh của mình, cái nào được ưu tiên. Ví dụ, nếu hai Jedis được đặt tên giống nhau, thì bạn có thể sử dụng tuổi của họ để quyết định cái nào đi trước và cái nào đứng thứ hai.

public int compareTo(Jedi jedi){ 
    int result = this.name.compareTo(jedi.getName()); 
    if(result == 0){ 
     result = this.age > jedi.age ? 1 : this.age < jedi.age ? -1 : 0; 
    } 
    return result; 
} 

Nếu bạn đã có một loạt các Jedis

Jedi[] jediAcademy = {new Jedi("Obiwan",80), new Jedi("Anakin", 30), ..} 

Tất cả bạn phải làm là yêu cầu đến lớp java.util.Arrays sử dụng phương pháp phân loại của nó.

Arrays.sort(jediAcademy); 

phương pháp Arrays.sort này sẽ sử dụng phương pháp compareTo của bạn để sắp xếp các đối tượng từng cái một.

+0

Để thêm, bạn có thể chọn hiển thị thứ tự danh sách theo thứ tự tăng dần hoặc giảm dần bằng cách hoán đổi vị trí của -1, 1 làm giá trị trả về – fardown

0

Tôi sẽ không có tham số Kiểu đối tượng, không có điểm khi truyền tham số cho Sinh viên nếu chúng tôi biết nó sẽ luôn là loại Sinh viên.

Để giải thích, "kết quả == 0" sẽ chỉ xảy ra khi các tên cuối cùng giống nhau, tại thời điểm đó chúng tôi so sánh tên đầu tiên và trả lại giá trị đó thay thế.

public int Compare(Object obj) 
{  
    Student student = (Student) obj; 
    int result = this.getLastName().compareTo(student.getLastName()); 

    if (result == 0) 
    { 
     result = this.getFirstName().compareTo(student.getFirstName()); 
    } 

    return result; 
} 
2

Nghe @milkplusvellocet, tôi muốn khuyên bạn nên thực hiện các giao diện Comparable đến lớp học của bạn là tốt.

Chỉ cần đóng góp vào các câu trả lời của những người khác:

String.compareTo() sẽ cho bạn biết cách khác nhau một chuỗi là từ khác.

ví dụ: System.out.println("Test".compareTo("Tesu")); sẽ in -1 và System.out.println("Test".compareTo("Tesa")); sẽ in 19

và giải pháp một dòng Nerdy và geeky để nhiệm vụ này sẽ là:

return this.lastName.equals(s.getLastName()) ? this.lastName.compareTo(s.getLastName()) : this.firstName.compareTo(s.getFirstName());

Giải thích:

this.lastName.equals(s.getLastName()) kiểm tra xem lastnames là cùng hoặc không this.lastName.compareTo(s.getLastName()) nếu có, sau đó trả lại so sánh tên cuối cùng. this.firstName.compareTo(s.getFirstName()) nếu không, trả về so sánh tên đầu tiên.

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