Многократная сортировка для файла, созданного из скриптов - PullRequest
0 голосов
/ 05 февраля 2020

Я генерирую файл .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 в порядке возрастания.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Лучший способ справиться с этим типом требований - определить класс с полями, которые вы хотите записать в файл. Следующим шагом является добавление всех желаемых записей в список и сортировка записей в соответствии с вашими требованиями. Наконец, выполните итерацию списка и запишите записи из него в файл. Ниже приведен пример кода:

Класс со всеми обязательными полями:

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();
        }
    }
}

Не стесняйтесь комментировать в случае сомнений.

0 голосов
/ 05 февраля 2020

Предполагая,


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);
...