为了账号安全,请及时绑定邮箱和手机立即绑定

排序数组对象的列表使用来自另一个数组的顺序列表

排序数组对象的列表使用来自另一个数组的顺序列表

拉丁的传说 2022-08-03 10:36:15
我有一个特殊顺序的“成员”数组:ArrayList<Member> sortedMembers我有另一个“成员”数组,可能包含也可能不包含第一个列表中的所有成员。ArrayList<Member> unsortedMembers为了判断第一个列表中的成员是否等于第二个列表中的成员,该类具有一个名为 的属性。MemberIntegermemberId那么,我该如何以最有效的方法订购第二个列表呢?我真的希望尽最大努力,例如,如果第一个列表中不包含a,只需在第二个列表末尾附加成员即可。Member
查看完整描述

1 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

您需要在排序顺序列表中查找项目,然后,如果存在,则获取它们的索引并使用这些索引进行排序。


排序列表.java

import java.util.*;


public class SortList {

    public static void main(String[] args) {

        List<Member> list = Arrays.asList(

            new Member( 1, "A"),

            new Member( 3, "C"),

            new Member(26, "Z"),

            new Member( 4, "D")

        );


        List<Member> order = Arrays.asList(

            new Member(4, "D"),

            new Member(3, "C"),

            new Member(2, "B"),

            new Member(1, "A")

        );


        sortBasedOn(list, order);


        list.stream().forEach(System.out::println);

    }


    public static <E> void sortBasedOn(List<E> toSort, List<E> ref, Comparator<E> comparator) {

        Collections.sort(toSort, comparator);

    }


    public static void sortBasedOn(List<Member> toSort, List<Member> ref) {

        sortBasedOn(toSort, ref, (left, right) -> {

            Optional<Member> foundLeft = ref.stream().filter(x -> x.getMemberId() == left.getMemberId()).findFirst();

            Optional<Member> foundRight = ref.stream().filter(x -> x.getMemberId() == right.getMemberId()).findFirst();

            if (!foundLeft.isPresent()) return 1;

            if (!foundRight.isPresent()) return -1;

            return Integer.compare(ref.indexOf(foundLeft.get()), ref.indexOf(foundRight.get()));

        });

    }

}

会员.java

public static class Member {

    private int memberId;

    private String name;


    public Member(int memberId, String name) {

        this.memberId = memberId;

        this.name = name;

    }


    public int getMemberId() {

        return memberId;

    }


    public String getName() {

        return name;

    }


    @Override

    public String toString() {

        return String.format("Member [memberId=%s, name=%s]", memberId, name);

    }

}


查看完整回答
反对 回复 2022-08-03
  • 1 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号