Как группировать по значению для данного диапазона значений SortedMap в Java? - PullRequest
1 голос
/ 09 июня 2019

У меня есть SortedMap, в котором есть набор идентификаторов учеников и результат их прохождения в виде логического значения со следующими данными:

1000 FALSE
1001 FALSE
1002 FALSE
1003 TRUE
1004 TRUE
1005 TRUE
1006 FALSE
1007 TRUE
1008 FALSE
1009 FALSE

У меня есть pojo (StudentInfo.java) со следующими переменными

String startRange, endRange; Boolean isPass

с соответствующими геттерами и сеттерами.

Мне нужно пройти через TreeMap и сохранить диапазон studentID и логический результат в pojo в зависимости от логического значения в следующем формате.

startRange: 1000
endRange: 1002
isPass: FALSE

startRange: 1003
endRange: 1005
isPass: TRUE

startRange: 1006
endRange: 1006
isPass: FALSE

startRange: 1007
endRange: 1007
isPass: TRUE

startRange: 1008
sendRange: 1009
isPass: FALSE

Для этого я инициализировал новый объект типа StudentInfo для вышеуказанных 5 диапазонов, чтобы сохранить его как ArrayList<StudentInfo>.Я опробовал приведенную ниже логику, но, похоже, я не понял ее.

private void createStudentInfo(SortedMap<String, Boolean> studentDetails, ArrayList<StudentInfo> list) {
        StudentInfo studentInfo;
        List<String> pass = new ArrayList<String>();
        List<String> fail = new ArrayList<String>();

        for(Map.Entry<String, Boolean> entry : studentDetails.entrySet()) {
            studentInfo = new StudentInfo();

            if(!entry.getValue()) {
                fail.add(entry.getKey());
                if(pass.size() > 0) {
                    studentInfo.setStartRange(pass.get(0));
                    studentInfo.setEndRange(pass.get(pass.size()-1));
                    studentInfo.setPass(true);

                    list.add(studentInfo);

                    pass.clear();
                }
            } else {
                pass.add(entry.getKey());

                if(fail.size() > 0) {
                    studentInfo.setStartRange(fail.get(0));
                    studentInfo.setEndRange(fail.get(fail.size()-1));
                    studentInfo.setPass(false);

                    list.add(studentInfo);

                    fail.clear();
                }
            }
        }
    }

Как мне выполнить итерацию и сформировать вышеуказанный диапазон?Пожалуйста, помогите.

1 Ответ

1 голос
/ 09 июня 2019

Я проверил код, который вы разместили, и он почти работал. За исключением того, что последняя группа не была добавлена.

Вот улучшенный код, который я протестировал и который работал:

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

public class StudentInfo {

    private String startRange;
    private String endRange;
    private boolean isPass;

    public static void main(String[] args) {
        SortedMap<String, Boolean> studentDetails = new TreeMap<String, Boolean>();
        studentDetails.put("1000", false);
        studentDetails.put("1001", false);
        studentDetails.put("1002", false);
        studentDetails.put("1003", true);
        studentDetails.put("1004", true);
        studentDetails.put("1005", true);
        studentDetails.put("1006", false);
        studentDetails.put("1007", true);
        studentDetails.put("1008", false);
        studentDetails.put("1009", false);
        List<StudentInfo> list = new ArrayList<StudentInfo>();
        createStudentInfo(studentDetails, list);
        list.stream().forEach(System.out::println);
    }

    private static void createStudentInfo(SortedMap<String, Boolean> studentDetails, List<StudentInfo> list) {
        StudentInfo studentInfo;
        List<String> pass = new ArrayList<String>();
        List<String> fail = new ArrayList<String>();

        for (Map.Entry<String, Boolean> entry : studentDetails.entrySet()) {
            studentInfo = new StudentInfo();

            if (!entry.getValue()) {
                fail.add(entry.getKey());
                if (pass.size() > 0) {
                    studentInfo.setStartRange(pass.get(0));
                    studentInfo.setEndRange(pass.get(pass.size() - 1));
                    studentInfo.setPass(true);

                    list.add(studentInfo);

                    pass.clear();
                }
            }
            else {
                pass.add(entry.getKey());

                if (fail.size() > 0) {
                    studentInfo.setStartRange(fail.get(0));
                    studentInfo.setEndRange(fail.get(fail.size() - 1));
                    studentInfo.setPass(false);

                    list.add(studentInfo);

                    fail.clear();
                }
            }
        }
        if (!pass.isEmpty()) {
            studentInfo = new StudentInfo();
            studentInfo.setStartRange(pass.get(0));
            studentInfo.setEndRange(pass.get(pass.size() - 1));
            studentInfo.setPass(true);

            list.add(studentInfo);
        }
        else if (!fail.isEmpty()) {
            studentInfo = new StudentInfo();
            studentInfo.setStartRange(fail.get(0));
            studentInfo.setEndRange(fail.get(fail.size() - 1));
            studentInfo.setPass(false);

            list.add(studentInfo);
        }
    }

    @Override
    public String toString() {
        return "StudentInfo [startRange=" + startRange + ", endRange=" + endRange + ", isPass=" + isPass + "]";
    }

    public String getStartRange() {
        return startRange;
    }
    public void setStartRange(String startRange) {
        this.startRange = startRange;
    }

    public String getEndRange() {
        return endRange;
    }
    public void setEndRange(String endRange) {
        this.endRange = endRange;
    }

    public boolean isPass() {
        return isPass;
    }
    public void setPass(boolean isPass) {
        this.isPass = isPass;
    }
}

Вывод был:

StudentInfo [startRange=1000, endRange=1002, isPass=false]
StudentInfo [startRange=1003, endRange=1005, isPass=true]
StudentInfo [startRange=1006, endRange=1006, isPass=false]
StudentInfo [startRange=1007, endRange=1007, isPass=true]
StudentInfo [startRange=1008, endRange=1009, isPass=false]
...