JavaRush /Java 博客 /Random-ZH /比较方法

比较方法

已在 Random-ZH 群组中发布
为了组织存储在数组或集合中的相同类型的对象,Java 开发人员提出了Comparable. 它只声明了一种方法compareTo
public interface Comparable<T> {
    public int compareTo(T o);
}
比较方法 - 1接口Comparable通过它接受作为方法参数的对象类型来参数化compareTo。在这种情况下,我们警告编译器我们要比较什么类型的对象。如果不满足类型标识条件,我们将收到错误ClassCastException。Java 中的方法compareTo将调用对象与作为参数传递的对象进行比较,并返回一个整数作为比较结果:
  • 如果调用对象大于作为参数传递的对象,则为正;
  • 如果调用对象小于作为参数传递的对象,则为负;
  • 如果对象相等则为 null。
编写对象比较逻辑是类开发人员唯一关心的事情,并且由所需的排序结果决定。

Java中为什么需要compareTo方法?

Java 程序员经常需要处理数组和对象列表。当处理大量数据时,以有组织或排序的形式存储数据通常很方便。首先,它在搜索必要信息时加快了对集合的处理速度,其次,组织好的数据在视觉上可以更好地感知。
比较方法 - 2
对对象数组进行排序的最简单、最有效的方法之一是类sort()方法Arrays,列表形式的对象集合也是类似的类方法Collections。为了使用这些方法进行排序,Java 开发人员让我们可以自由选择如何指定排序标准:通过在Comparable我们想要排序的对象类中实现接口,或者使用Comparator. 在第一种情况下,排序方法接受数组或列表形式的一组对象:
sort(T[]array)//sorting массива
sort(List<T> list)// sorting списка
在第二个中 - 加上该接口的另一个实现Comparator
sort(T[]array, Comparator <? super T> comparator)//sorting массива
sort(List<T> list, Comparator <? super T> comparator)// sorting списка
Comparable当我们想要在排序时设置对象的自然顺序(从我们的角度来看最符合逻辑)时,可以使用 该接口。这也是一种在设计阶段“硬连线”用于比较此类对象的算法的方法。例如,使用此接口的实现,定义了主要基元类型的包装类中的自然排序标准:, Byte, Character, Long, Integer, Short, Double, Float, BooleanString这也意味着这些类有一个实现的方法compareTo,我们可以在需要时在程序中使用。我们通过一个字符串比较的例子来看看这个方法在类中是如何实现的String
String str1="Аарон";
        String str2="АAPOH";
        String str3="аарон";
        String str4="ААрон";
        String str5="аАрон";
        String str6="Берта";
        String str7="берта";
String[] allStr=new String[]{str1,str2,str3,str4, str5,str6, str7};
        Arrays.sort(allStr);
        for (String s:allStr){
            System.out.println(s);
        }
    }
如果我们在方法中执行这段代码main,我们将得到以下结果:
АAPOH
ААрон
Аарон
Берта
аАрон
аарон
берта
正如您在类中的示例中看到的String,该方法compareTo按字母顺序、字典顺序和区分大小写排列字符串。类的开发人员将这种字符串比较顺序定义String为自然的。为了更简单地理解什么是词典顺序,记住单词在语言词典中的排列方式就足够了。比较数字时,对象按升序排列。该比较逻辑嵌入在类Byte, Character, Long, Integer, Shor, Double,中Float

让我们在我们的班级中实现一下比较

让我们看一个示例,了解如何在类中构建比较对象的能力。在实现comparetoJava 方法时,我们可以指定一个或多个对象排序标准,也可以使用和类compareto中的方法。例如,对于类对象,我们设置按名称排序,如果名称相同,则按年龄排序。对象将按其自然顺序排列(随着值的增加)。班级: StringIntegerUserUser
public class User  implements Comparable <User>{//добавляем возможность сравнивать an objectы User

    private String name;
    private Integer age;
    private String email;

    public User(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }

    @Override
//реализуем метод compareTo интерфейса Comparable
    public int compareTo(User o) {

//используем метод compareTo из класса String для сравнения имен
        int result = this.name.compareTo(o.name);

//если имена одинаковые -  сравниваем возраст,
используя метод compareTo из класса Integer

        if (result == 0) {
            result = this.age.compareTo(o.age);
        }
        return result;
    }

    @Override
    public String toString() {
        return "{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                '}';
    }
让我们使用类方法来测试compareTo类中实现的 方法的运行情况: UsersortCollections
public static void main(String[] args) {
    User user = new User("Andrey", 19, "andryha@mail.ru");
    User user2 = new User("Олег", 25, "oleg@mail.ru");
    User user3 = new User("Andrey", 24,"opr@google.com");
    User user4 = new User("Igor", 16, "igor@mail.ru");
    User user5 = new User("Andrey", 44,"stary@google.com");
    List<User> list = new ArrayList<>();

    list.add(user);
    list.add(user2);
    list.add(user3);
    list.add(user4);
    list.add(user5);

    System.out.println("-------до сортировки--------");
    for (User u : list) {
        System.out.println(u);
    }
    System.out.println("-------после сортировки-----");
    Collections.sort(list);
    for (User u : list) {
        System.out.println(u);
    }
}
 }
}
该方法的结果main
-------до сортировки--------
{name='Андрей',  age=19,  email='andryha@mail.ru'}
{name='Олег',    age=25,  email='oleg@mail.ru'}
{name='Андрей',  age=24,  email='opr@google.com'}
{name='Игорь',   age=16,  email='igor@mail.ru'}
{name='Андрей',  age=44,  email='stary@google.com'}
-------после сортировки-----
{name='Андрей',  age=19,  email='andryha@mail.ru'}
{name='Андрей',  age=24,  email='opr@google.com'}
{name='Андрей',  age=44,  email='stary@google.com'}
{name='Игорь',   age=16,  email='igor@mail.ru'}
{name='Олег',    age=25,  email='oleg@mail.ru'}
那么,我们来总结一下。如果您是一切事物秩序的支持者,并且希望将对象排列在数组或列表中,而无需编写不必要的代码,请使用接口Comparable。它的compareTo方法的实现使得在类中构建自然排序对象的机制变得非常容易。如果您必须使用 Java 库中描述的标准类的对象集合和数组,请在这些类中使用现成的实现compareTo
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION