简体   繁体   English

如何按升序 Java 按内部值对对象进行排序?

[英]How do i Sort Objects by Inside Values in Ascending Order Java?

I have list of objects containing data as Name(String) and Timestamp (Long).我有包含名称(字符串)和时间戳(长)等数据的对象列表。 I am trying to sort these objects based on Timestamp in ascending order.我正在尝试根据时间戳按升序对这些对象进行排序。

MyCode.java MyCode.java

import java.util.ArrayList;
import java.util.Collections;

class Friend
{
    long time;
    String name;
    Friend(long t,String n)
    {
        time=t;
        name=n;
    }
}


public class Practice4 {
    public static void main(String[] args) {
        long l1=1590065750535l;
        long l2=1590065760674l;
        long l3=1590065784567l;
        long l4=1590065760674l;

        Friend f[]=new Friend[4];

        f[0]=new Friend(l1,"A");
        f[1]=new Friend(l3,"B");
        f[2]=new Friend(l2,"C");
        f[3]=new Friend(l4,"D");

        ArrayList<Friend> list=new ArrayList<Friend>();
        list.add(f[0]); list.add(f[1]); list.add(f[2]); list.add(f[3]);

        Collections.sort(list); //error
        System.out.println(list);
    }
}

How do i sort these Friend objects by Timestamp and display them?如何按时间戳对这些 Friend 对象进行排序并显示它们?

In order to be sorted with Collections.sort or Arrays.sort your class Friend has to implement Comparable interface:为了使用Collections.sortArrays.sort进行排序,您的 class Friend必须实现Comparable接口:

class Friend implements Comparable<Friend>
{
    long time;
    String name;
    Friend(long t,String n)
    {
        time=t;
        name=n;
    }

    @Override
    public int compareTo(Friend f) {
        if (time == f.time) {
            return name.compareTo(f.name);
        }
        return time - f.time > 0 ? 1 : -1;
    }

    @Override
    public String toString() {
        return "Friend{" +
                "time=" + time +
                ", name='" + name + '\'' +
                '}';
    }
}

Also you should override toString() method to be able to view if the collection/array has been sorted properly.此外,您应该覆盖toString()方法,以便能够查看集合/数组是否已正确排序。

If you need to implement more flexible sorting of your custom class, it's better to implement a Comparator object:如果您需要对自定义 class 实现更灵活的排序,最好实现一个Comparator器 object:

Collections.sort(list, (f1, f2) -> {  // inverse comparator as lambda
    if (f1.time == f2.time) {
        return - f1.name.compareTo(f2.name);
    }
    return f1.time - f2.time > 0 ? -1 : 1;
});

Problem has solved by this code.此代码已解决问题。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;

class Friend 
{
    long time;
    String name;
    Friend(long t,String n)
    {
        time=t;
        name=n;
    }
}


public class Practice4 {
    public static void main(String[] args) {
        long l1=1590065750535l;
        long l2=1590065760674l;
        long l3=1590065784567l;
        long l4=1590065760674l;

        Friend f[]=new Friend[4];

        f[0]=new Friend(l1,"A");
        f[1]=new Friend(l3,"B");
        f[2]=new Friend(l2,"C");
        f[3]=new Friend(l4,"D");

        ArrayList<Friend> list=new ArrayList<Friend>();
        for(int i=0;i<f.length;i++)
            list.add(f[i]);

        Collections.sort(list,new Comparator<Friend>() {

            public int compare(Friend arg0, Friend arg1) {

                return (int) (arg0.time - arg1.time);
            }
        });

        for(Friend l: list)
        {
            System.out.println("Name: "+l.name+", Time: "+l.time);
        }
    }
}

Add the comparator to the sort将比较器添加到排序中

Collections.sort(list, (c1, c2) -> Long.valueOf(c1.time).compareTo(Long.valueOf(c2.time)));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM