Hoang Nguyen
Hoang Nguyen

Reputation: 27

Sort Java List of Objects with String field as numerical

I need to sort a list of object in Java 7. Please someone help.

The list is:

List<Question> questionlist;

The Question object:

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

Here is what in the List:

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

I would like to sort it so that it will be in the order below:

12.1

12.2

12.3

12.4

12.10

Regular Collection.sort will give me the following order:

12.1

12.10

12.2

12.3

12.4

Here is what I tried and works in Java 8:

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

    List<String> 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());

Upvotes: 1

Views: 826

Answers (2)

Arvind Kumar Avinash
Arvind Kumar Avinash

Reputation: 79105

Do it as follows:

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

Complete code:

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

Output:

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]

Upvotes: 1

TheSemicolon
TheSemicolon

Reputation: 77

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

Upvotes: 1

Related Questions