对从Java生成的文件进行多重排序

问题描述 投票:-2回答:2

我正在从beanshell脚本生成.txt文件。现在我在排序时遇到问题。如果有人可以提出任何想法,那将是很大的帮助。该文件如下所示:

UserId FirstName LastName  Status     roleId
2025    A           B       Active     3
2021    C           D       InActive   2
2036    E           F       Active     1
3012    G           H       Active     2
5012    I           J       InActive   1

排序时应以Status升序,然后以roleId升序,然后以UserId升序写。

sorting beanshell
2个回答
0
投票

假设


public class User {

    private Integer userId;
    private String firstName, lastName;
    public enum Status{
        ACTIVE, INACTIVE;
    }
    private Status status;
    private Integer roleId;

     // getter and setter
}

您可以使用类似的比较器:


public class UserComparator implements Comparator<User> {

    @Override
    public int compare(User o1, User o2) {

    @Override
    public int compare(User o1, User o2) {
        int bystatus = o1.getStatus().compareTo(o2.getStatus());
        if (bystatus != 0) {
            return bystatus;
        }
        int byid = o1.getUserId().compareTo(o2.getUserId());
        if (byid != 0) {
            return byid;
        }
        return o1.getRoleId().compareTo(o2.getRoleId());
    }

}

最后:

Collections.sort(list, comparator);

0
投票

处理此类要求的最佳方法是使用要写入文件的字段定义一个类。下一步是将所有所需的记录添加到列表中,然后根据您的要求对记录进行排序。最后,迭代列表并将记录从列表写入文件。下面是示例代码:

一个具有所有必填字段的类:

class Member {
    int userId;
    String firstName, lastName, status;
    int roleId;

    public Member(int userId, String firstName, String lastName, String status, int roleId) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.status = status;
        this.userId = userId;
        this.roleId = roleId;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public int getRoleId() {
        return roleId;
    }

    public void setRoleId(int roleId) {
        this.roleId = roleId;
    }
}

文件编写器类:

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class MemberWriter {
    public static void main(String[] args) {
        FileWriter writer;
        try {
            writer = new FileWriter(new File("members.txt"));
            List<Member> list = new ArrayList<Member>();
            list.add(new Member(2025, "A", "B", "Active", 3));
            list.add(new Member(2021, "C", "D", "InActive", 2));
            list.add(new Member(2036, "E", "F", "Active", 1));
            list.add(new Member(3012, "G", "H", "Active", 2));
            list.add(new Member(5012, "I", "J", "InActive", 1));

            Comparator<Member> comparator = Comparator.comparing(Member::getStatus).thenComparing(Member::getRoleId)
                    .thenComparing(Member::getUserId);
            Collections.sort(list, comparator);

            writer.write("UserId\tFirstName\tLastName\tStatus\tRoleId\n");
            for (Member member : list) {
                writer.write(member.getUserId() + "\t" + member.getFirstName() + "\t" + member.getLastName() + "\t"
                        + member.getStatus() + "\t" + member.getRoleId() + "\n");
            }
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.