0

我有一组电话簿元素,我正在尝试使用可比排序根据字典顺序对它们进行排序。但这一切都一团糟。请帮忙。提前致谢

它也将有助于描述java中的排序功能!这是代码:

package myphonebook;

import javax.swing.*;
import java.util.Arrays;
import java.util.Comparator;
public class MyPhoneBook implements Comparator<MyPhoneBook>{

    private String name,email,number;
    MyPhoneBook()
    {
    }

    public void input()
    {
        name = (JOptionPane.showInputDialog("Enter Name:\n")).toString();
        number = JOptionPane.showInputDialog("Enter Number:\n").toString();
        email = JOptionPane.showInputDialog("Enter email:\n").toString();
    }
    public void print()
    {
        JOptionPane.showMessageDialog(null, "Name: " + name+ "\n" + "Phone: " +number          +"\n"     +       "Email: " + email);
    }

    public static void main(String[] args) {
        MyPhoneBook a[] = new MyPhoneBook[300];
        MyPhoneBook b = new MyPhoneBook();
        //final Integer[] sorted = ArrayUtils.toObject(MyPhoneBook);
        int i,n;
        n = Integer.parseInt(JOptionPane.showInputDi… total number:\n"));
        for(i=0;i<n;i++)
        {
            a[i] = new MyPhoneBook();
            a[i].input();
        }
        Arrays.sort(a);
        for(i=0;i<n;i++)
        {
            a[i].print();
        }
    }

    @Override
    public int compare(MyPhoneBook o1, MyPhoneBook o2) {
        return o1.number.compareTo(o2.number);
    }

    public int compareTo(MyPhoneBook o) {
        if(this.name.equals(o.name)) return this.number.compareTo(o.number);
        if(this.number.equals(o.number)) return this.email.compareTo(o.email);
        if(this.email.equals(o.email)) return this.name.compareTo(o.name);
        return 0;
    }
}
4

3 回答 3

1

只需使用String#compareTo,它会按字典顺序比较两个字符串。比较基于字符串中每个字符的 Unicode 值。

public class MyPhoneBook implements Comparable<MyPhoneBook>{
    @Override
    public int compareTo(MyPhoneBook o) {
            int returnValue =0;
            if(o!=null){
                  returnvalue = this.name.compareTo(o.name);
                  if(returnValue==0){
                       returnValue = this.number.compareTo(o.number);
                       if(returnValue==0){
                              returnValue = this.email.compareTo(o.email);
                      }
                  }

            }
            return returnValue;
        }
}
于 2013-05-17T06:35:31.860 回答
1

这里有几个问题:第一个是您的比较实际上不是字典顺序的。例如,当名称相同时,您将完全忽略比较逻辑中的电子邮件地址。第二个问题是您未能将比较器指定为 Arrays.sort() 的参数。

第一个问题:修复比较逻辑

如果您可以在您的代码中使用第三方库,那么处理这个问题的一个非常简洁的方法是使用Guava库(Google 的开源核心 Java 库)中的ComparisonChain类:

public int compareTo(MyPhoneBook o) {
  return ComparisonChain
      .start()
      .compare(name, o.name)
      .compare(email, o.email)
      .compare(number, o.number)
      .result();
 }

但是,假设您不能这样做,这是正确的方法:

public int compareTo(MyPhoneBook o) {
   int nameComparison = name.compareTo(o.name);
   if (nameComparison != 0) {
     return nameComparison;
   }
   int emailComparison = email.compareTo(o.email);
   if (emailComparison != 0) {
     return emailComparison;
   }
   return number.compareTo(o.number);
}

第二个问题:使用比较器调用 Arrays.sort()

而不是您当前对 Arrays.sort() 的调用,请使用:

Arrays.sort(a, new PhoneBookComparator());

并将 PhoneBookComparator 定义为单独的 Comparator 类。

于 2013-05-17T06:46:43.570 回答
0

运行您发布的代码时,它会出现

Exception in thread "main" java.lang.ClassCastException: ...
MyPhoneBook cannot be cast to java.lang.Comparable

这是因为你打电话

Arrays.sort(a);

Arrays.html#sort期望数组中包含的对象实现接口Comparable。不过,您的班级正在实施Comparator

您应该将您的类声明更改为以下之一

public class MyPhoneBook implements Comparable<MyPhoneBook> {

然后删除

@Override
public int compare(MyPhoneBook o1, MyPhoneBook o2) {
    return o1.number.compareTo(o2.number);
}

或者

public class MyPhoneBook {

和排序的调用

Arrays.sort(a, new Comparator<MyPhoneBook>() {
    @Override
    public int compare(MyPhoneBook o1, MyPhoneBook o2) {
        // TODO implment here your comapre logic
        return o1.number.compareTo(o2.number);
    }
});

在你修复之后你会得到 NullPointerException,因为这条线

Arrays.sort(a);

这是因为您传递了一个长度数组,300并且您不必将所有 300 个元素都放入其中,因为您要求total number

你应该使用

Arrays.sort(a, 0, n);

这仅对具有数据的范围进行排序。请参阅javadoc

于 2013-05-17T06:55:06.703 回答