2012-04-10 3 views
0

Я дал им ассимиляцию и ее последний день. Я сделал большую часть этого, но по последнему вопросу у меня возникла проблема с созданием функции compareTo().Java compareTo (Object obj)

Вот что он от нас хочет;

CompareTo

общественного ИНТ CompareTo (java.lang.Object другие)

Specified by: 
    compareTo in interface java.lang.Comparable 

Вот что я сделал

public int compareTo(Object obj) 
{ 
Document tmp = (Document)obj; 
if(this.text < tmp.text) 
{ 
/* instance lt received */ 
return -1; 
} 
else if(this.text > tmp.text) 
{ 
/* instance gt received */ 
return 1; 
} 
/* instance == received */ 
return 0; 
} 

Вот файл вся моя Document.java

класс Документ { private Str текст;

/** 
* Default constructor; Initialize amount to zero. 
*/ 
public Document() 
{ 
    text = ""; 
} 

/** 
* Default constructor; Initialize text to input value 
* @param text New text value 
*/ 
public Document(String text) 
{ 
    this.text = text; 
} 

/** 
* Returns as a string the contents of the Document. 
*/ 
public String toString() 
{ 
    return text; 
} 

И вот тестовый файл сам по себе.

import java.util.Arrays;

общественного класса Homework2 расширяет документ {

/** ====================== 
* ContainsKeyword 
* Returns true if the Document 
* object passed in contains keyword as a substring 
* of its text property. 
* ====================== 
*/ 
public static boolean ContainsKeyword(Document docObject, String keyword) 
{ 
    if (docObject.toString().indexOf(keyword,0) >= 0) 
     return true; 
    return false; 
} 


public static void main(String[] args){ 

    Email email1= new Email("Programming in Java", 
      "Larry", "Curly", "Programming"); 
    Email email2 = new Email("Running marathons", 
      "Speedy", "Gonzales", "races"); 

    System.out.println(email1); 

    File file1 = new File("Some Java file", "file.txt"); 
    File file2 = new File(
      "Boluspor wins against Besiktas. Muahahahaha", 
    "bolutas.txt"); 

    Document doc = new Document (
    "ok?,ok?,ok?,ok?,ok?,ok?,ok?,ok?,ok?,ok?,ok?,ok?"); 

    System.out.println("\n"+file1); 

    System.out.println("\nWhich contains Java?"); 
    if (ContainsKeyword(email1,"Java")) System.out.println(" Email1"); 
    if (ContainsKeyword(email2,"Java")) System.out.println(" Email2"); 
    if (ContainsKeyword(file1,"Java")) System.out.println(" File1"); 
    if (ContainsKeyword(file2,"Java")) System.out.println(" File2"); 

    Document [] da = new Document [5]; 
    da[0] = email1; 
    da[1] = email2; 
    da[2] = file1; 
    da[3] = file2; 
    da[4] = doc; 
    Arrays.sort(da); 
    System.out.println("\nAfter sort:"); 
    for(Document d : da){ 
     System.out.println(d); 
    } 
} 
} 

То, что я хотел спросить, я не могу сравнивать объекты из моего Email.java и File.java, я могу сделать что-нибудь еще, кроме последней части, которая начинается с Документом [] da ... Эта часть дает ошибку. Что я здесь делаю неправильно?

Ошибка;

Exception in thread "main" java.lang.ClassCastException: Email cannot be cast to java.lang.Comparable 
at java.util.Arrays.mergeSort(Arrays.java:1144) 
at java.util.Arrays.sort(Arrays.java:1079) 
at Homework2.main(Homework2.java:53) 

ЗАГРУЗИТЬ ** Вот мой E-mail и файл класса ..

/** 
* First define class for Email, derive from Document 
*/ 
class Email extends Document 
{ 
    private String sender; 
    private String recipient; 
    private String title; 
    private String body; 

    /** 
    * Constructors 
    */ 
    public Email() 
    { 
     super(); 
     sender = ""; 
     recipient = ""; 
     title = ""; 
     body = ""; 
    } 

    public Email(String body, String sender, String recipient, String title) 
    { 

     this.sender = sender; 
     this.recipient = recipient; 
     this.title = title; 
     this.body = body; 
    } 

    // ====================== 
    // Various accessor and mutator methods 
    // ====================== 
    public String getSender() 
    { 
     return sender; 
    } 

    public void setSender(String sender) 
    { 
     this.sender = sender; 
    } 

    public String getRecipient() 
    { 
     return recipient; 
    } 

    public void setRecipient(String recipient) 
    { 
     this.recipient = recipient; 
    } 

    public String getTitle() 
    { 
     return title; 
    } 

    public void setTitle(String title) 
    { 
     this.title = title; 
    } 
    public String getBody(){ 
     return body; 
    } 
    public void getBody(String body){ 
     this.body = body; 
    } 

    /** 
    * Returns as a string the contents of the text fields concatenated 
    * together. Uses super.toString to get the parent's text. 
    */ 
    public String toString() 
    { 
return "Sender:" + sender + ",Recipient:" + recipient + ",Title:" + title + ",Body:" + body + " " + 
super.toString(); 
    } 
} // Email 

и файлов;

/** 
* Next define class for File, derive from Document 
* For brevity, short one-line methods are defined here in the 
* header. 
*/ 
class File extends Document 
{ 
private String pathname; 

/** 
* Constructors. 
*/ 
public File() 
{ 
    super(); 
    pathname = ""; 
} 

public File(String body, String pathname) 
{ 
    super(body); 
    this.pathname = pathname; 
} 

// ====================== 
// Various accessor and mutator methods 
// ====================== 
public void setPathname(String s) 
{ 
    pathname = s; 
} 

public String getPathname() 
{ 
    return pathname; 
} 

/** 
* Returns as a string the contents of the text fields concatenated 
* together. Uses super.toString to get the parent's text. 
*/ 
public String toString() 
{ 
    return "Pathname " + pathname + " Body " + super.toString(); 
} 

} // Файл

+0

Является ли это домашнее задание? – Aaron

+0

Присвоение моей, в которой есть 10 вопросов и 1.5 недели. И это часть последнего вопроса, который я застрял. –

+3

Вы не показали нам ничего о своих классах электронной почты или файла, а также не показали нам, где реализован метод compareTo. Почему ваш класс Homework2 расширяет Document? –

ответ

0

Что вы делаете неправильно в сообщении об ошибке.

Вы можете сортировать объекты только для классов, которые реализуют Comparable. У вашего класса нет.

Поскольку вы сортируете несколько разных типов, вы можете захотеть предоставить собственный Компаратор вместо того, чтобы сделать документ сопоставимым.

2

Куда вы поместили метод compareTo? Если вы пытаетесь сортировать массив Document с, вам необходимо иметь документ реализовать Сопоставимые (или передать в Компаратор):

public class Document implements Comparable<Document> { 

Или, если по какой-то странной причине вы не можете использовать дженерики :

public class Document implements Comparable { 

Затем положить compareTo в Document.

1

Точная причина это не удается, потому что вы пытаетесь вызвать Arrays.sort на класс, который не реализует сравнимой

Реализация Сопоставимые позволяет

calling Collections.sort and Collections.binarySearch 
    calling Arrays.sort and Arrays.binarySearch 
    using objects as keys in a TreeMap 
    using objects as elements in a TreeSet 

Email не осуществлять Сопоставимые интерфейс

public class Email implements Comparable<Email> 

читать это сделать одолжение http://www.javapractices.com/topic/TopicAction.do?Id=10

Другой примечание Вы сказали, что вы хотите сравнить

Email.java и File.java

Вам нужно будет настраиваемая функция для этого на основе логики.

compareTo используется для сравнения двух экземпляров того же типа. Это также означает, что функция живет в классе Email

Email myEmail = new Email(); 
Email hisEmail = new Email(); 

myEmail.compareTo(hisEmail); 
0

попробовать это:

Вот файл вся моя Document.java

class Document implements Comparable { //this line is your solution. 
private String text; 

/** 
* Default constructor; Initialize amount to zero. 
*/ 
public Document() 
{ 
    text = ""; 
} 

/** 
* Default constructor; Initialize text to input value 
* @param text New text value 
*/ 
....} 
+0

Я пробовал оба решения, но он все еще не мог сортировать данные входы:/ Изменил необходимые вещи. Выполнил его также с помощью Comparable, но должен ли я создать другой метод для электронной почты и файла? –

+0

1.) Вы можете сравнить только со сравнимыми вещами, поэтому да, вам нужно реализовать электронную почту и файл. 2.) так как вы отправляете электронную почту и файлы. Документ, который можно сравнивать, электронная почта и файл также сопоставимы, если вы предоставляете его «текст» (я имею в виду, что вы должны называть супер («someInfo»)) так в вашей электронной почте конструктор (этот: общедоступный адрес электронной почты (тело String, отправитель String, получатель String, заголовок String)), вы забудете назвать super (title) – guness

Смежные вопросы