Reputation: 27
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
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
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