用字符串字段作为数字对java对象列表进行排序

ylamdve6  于 2021-07-12  发布在  Java
关注(0)|答案(3)|浏览(404)

我需要对Java7中的对象列表进行排序。请有人帮忙。
列表为: List<Question> questionlist; 问题对象:

public class Question {
    public String QuestionNumber;
    public String title;
    public String description;
}

以下是列表中的内容: questionlist.add(new Question("12.2", "titleA", "titleA_Desc")); questionlist.add(new Question("12.1", "titleB", "titleB_Desc")); questionlist.add(new Question("12.3", "titleC", "titleC_Desc")); questionlist.add(new Question("12.10", "titleD", "titleD_Desc")); questionlist.add(new Question("12.4", "titleE", "titleE_Desc")); 我想对它进行分类,以便按以下顺序排列: 12.1 12.2 12.3 12.4 12.10 常规collection.sort会给我以下命令:
12.1
12.10
12.2
12.3
12.4
以下是我在java 8中尝试和使用的内容: List<String> list = Arrays.asList("12.2", "12.1", "12.3", "12.4", "12.5", "12.10"); ```
List sortedList_Fix = list.stream()
.sorted(Comparator.comparing((String s) -> s.split("\."),
Comparator.comparing((String[] a) -> Integer.parseInt(a[0]))
.thenComparingInt((a) -> a.length > 1 ? Integer.parseInt(a[1]) : 0)))
.collect(Collectors.toList());

qvk1mo1f

qvk1mo1f1#

按以下步骤操作:

Collections.sort(questionlist, new Comparator<Question>() {

    @Override
    public int compare(Question q1, Question q2) {
        String q1NumParts[] = q1.getQuestionNumber().split("\\.");
        String q2NumParts[] = q2.getQuestionNumber().split("\\.");
        if (Integer.parseInt(q1NumParts[0]) > Integer.parseInt(q2NumParts[0])) {
            return 1;
        } else if (Integer.parseInt(q1NumParts[0]) < Integer.parseInt(q2NumParts[0])) {
            return -1;
        } else {
            if (Integer.parseInt(q1NumParts[1]) > Integer.parseInt(q2NumParts[1])) {
                return 1;
            } else if (Integer.parseInt(q1NumParts[1]) < Integer.parseInt(q2NumParts[1])) {
                return -1;
            }
        }
        return 0;
    }
});

完整代码:

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

class Question {
    public String QuestionNumber;
    public String title;
    public String description;

    public Question(String questionNumber, String title, String description) {
        super();
        QuestionNumber = questionNumber;
        this.title = title;
        this.description = description;
    }

    public String getQuestionNumber() {
        return QuestionNumber;
    }

    public void setQuestionNumber(String questionNumber) {
        QuestionNumber = questionNumber;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public String toString() {
        return "Question [QuestionNumber=" + QuestionNumber + ", title=" + title + ", description=" + description + "]";
    }
}

public class Main {
    public static void main(String[] args) {
        List<Question> questionlist = new ArrayList<>();
        questionlist.add(new Question("12.2", "titleA", "titleA_Desc"));
        questionlist.add(new Question("12.1", "titleB", "titleB_Desc"));
        questionlist.add(new Question("12.3", "titleC", "titleC_Desc"));
        questionlist.add(new Question("12.10", "titleD", "titleD_Desc"));
        questionlist.add(new Question("12.4", "titleE", "titleE_Desc"));

        Collections.sort(questionlist, new Comparator<Question>() {

            @Override
            public int compare(Question q1, Question q2) {
                String q1NumParts[] = q1.getQuestionNumber().split("\\.");
                String q2NumParts[] = q2.getQuestionNumber().split("\\.");
                if (Integer.parseInt(q1NumParts[0]) > Integer.parseInt(q2NumParts[0])) {
                    return 1;
                } else if (Integer.parseInt(q1NumParts[0]) < Integer.parseInt(q2NumParts[0])) {
                    return -1;
                } else {
                    if (Integer.parseInt(q1NumParts[1]) > Integer.parseInt(q2NumParts[1])) {
                        return 1;
                    } else if (Integer.parseInt(q1NumParts[1]) < Integer.parseInt(q2NumParts[1])) {
                        return -1;
                    }
                }
                return 0;
            }
        });

        for (Question q : questionlist) {
            System.out.println(q);
        }
    }
}

输出:

Question [QuestionNumber=12.1, title=titleB, description=titleB_Desc]
Question [QuestionNumber=12.2, title=titleA, description=titleA_Desc]
Question [QuestionNumber=12.3, title=titleC, description=titleC_Desc]
Question [QuestionNumber=12.4, title=titleE, description=titleE_Desc]
Question [QuestionNumber=12.10, title=titleD, description=titleD_Desc]
fwzugrvs

fwzugrvs2#

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

public class Question implements Comparable<Question> {
    public String questionNumber;
    public String title;
    public String description;

    public Question (String questionNumber, String title, String description) {
        this.questionNumber = questionNumber;
        this.title = title;
        this.description = description;
    }

    public String getQuestionNumber() {
        return questionNumber;
    }

    @Override
    public int compareTo(Question question) {
        String questionNumber = question.getQuestionNumber();

        int compareTo = ((Integer)Integer.parseInt(this.getQuestionNumber().split("\\.")[0])).compareTo((Integer)Integer.parseInt(questionNumber.split("\\.")[0]));

        if(compareTo != 0 ){
            return compareTo;
        } else {
            return ((Integer)Integer.parseInt(this.getQuestionNumber().split("\\.")[1])).compareTo((Integer)Integer.parseInt(questionNumber.split("\\.")[1]));
        }

    }

    @Override
    public String toString() {
        return "Question [questionNumber=" + questionNumber + ", title=" + title + ", description=" + description + "]";
    }

    public static void main(String[] args) {

        List<Question> questionList = new ArrayList<Question>();

        questionList.add(new Question("12.2", "titleA", "titleA_Desc"));
        questionList.add(new Question("12.1", "titleB", "titleB_Desc"));
        questionList.add(new Question("12.3", "titleC", "titleC_Desc"));
        questionList.add(new Question("12.10", "titleD", "titleD_Desc"));
        questionList.add(new Question("12.4", "titleE", "titleE_Desc"));

        Collections.sort(questionList);

        for (Question question : questionList) {
            System.out.println(question);
        }
    }
}
olqngx59

olqngx593#

为您的名单

List<String> list = Arrays.asList("12.2", "12.1", "12.3", "12.4", "12.5", "12.10");

您可以使用:

public static List<String> sort(List<String> nums) {
    Comparator comparator = new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            if (o1.equals(o2)) {
                return 0;
            } else {
                String secondPartO1 = o1.replaceAll("^\\d+\\.", ""); // OR o1.split("\\.")[1]
                String firstPartO1 = o1.replaceAll("\\.\\d+$", "");
                String secondPartO2 = o2.replaceAll("^\\d+\\.", "");
                String firstPartO2 = o2.replaceAll("\\.\\d+$", "");
                if (Integer.parseInt(firstPartO1) > Integer.parseInt(firstPartO2)) {
                    return 1;
                } else if ((Integer.parseInt(firstPartO1) == Integer.parseInt(firstPartO2))
                        && ((Integer.parseInt(secondPartO1) > Integer.parseInt(secondPartO2)))) {
                    return 1;
                } else {
                    return -1;
                }
            }
        }
    };
    Collections.sort(nums, comparator);
    return nums;
}

replaceall(“.\d+$”,“”)
将删除一个点之后的所有数字,然后在一个点之前得到一个数字。
replaceall(“^\d+.”,”“)
将删除一个点之前的所有数字,然后得到一个点之后的数字。

相关问题