Java collections sort method for string is not working properly for case sensitive and special characters












17















I was working on sorting a list of String in Java (1.8) and came to know that it is not working as expected!



I am trying the following code for sorting:



private Set<String> getTestData() {
Set<String> compRoles = new HashSet<>();
compRoles.add("AA");
compRoles.add("Aa");
compRoles.add("aA");
compRoles.add("aa");
compRoles.add("11");
compRoles.add("117");
compRoles.add("12");
compRoles.add("21");
compRoles.add("!@");
compRoles.add("@!");
compRoles.add("@@!");
compRoles.add("BB");
compRoles.add("Bb");
compRoles.add("bb");
return compRoles;
}

public static void main(String args) {
List<String> test = new ArrayList<>(new Test().getTestData());
System.out.println(test);
Collections.sort(test);
System.out.println(test);
}


Before sort: [AA, Aa, aA, aa, 11, BB, Bb, bb, 12, @!, @@!, 117, 21, !@]



After sort: [!@, 11, 117, 12, 21, @!, @@!, AA, Aa, BB, Bb, aA, aa, bb]



My expectation is: [!@, @!, @@!, 11, 117, 12, 21, aa, aA, Aa, AA, bb, Bb, BB]



Do I need to use something else other that natural sort for this?










share|improve this question




















  • 13





    so, for you 'a' comes before 'A' .. ok. well, you'll need to write your own sorting logic, but it 'll be pretty broad. you'll actually have to compare char by char. good luck.

    – Stultuske
    20 hours ago






  • 8





    The answer is in the question. Given that the natural ordering doesn't order elements as you would like to, you need something else.

    – JB Nizet
    20 hours ago













  • This is already implemented in jQuery sort. datatables.net/examples/styling/bootstrap4 But I don't the the algo they are using! Because of this UI and back-end is not in sync. Any idea on this?

    – Prabal Srivastava
    19 hours ago






  • 1





    The unicode of ! is smaller than that of @ , unicode of @ is small than 1, unicode of 1 is smaller than A, uncicode of A is smaller than a. Hope it answers for the output that you get. Now If you need sorting as per your ordering , implement your comparator.

    – nits.kk
    18 hours ago











  • @nits.kk: I am totally agree with the answer given by jaspreet. We can solve this issue by using docs.oracle.com/javase/7/docs/api/java/text/Collator.html

    – Prabal Srivastava
    18 hours ago
















17















I was working on sorting a list of String in Java (1.8) and came to know that it is not working as expected!



I am trying the following code for sorting:



private Set<String> getTestData() {
Set<String> compRoles = new HashSet<>();
compRoles.add("AA");
compRoles.add("Aa");
compRoles.add("aA");
compRoles.add("aa");
compRoles.add("11");
compRoles.add("117");
compRoles.add("12");
compRoles.add("21");
compRoles.add("!@");
compRoles.add("@!");
compRoles.add("@@!");
compRoles.add("BB");
compRoles.add("Bb");
compRoles.add("bb");
return compRoles;
}

public static void main(String args) {
List<String> test = new ArrayList<>(new Test().getTestData());
System.out.println(test);
Collections.sort(test);
System.out.println(test);
}


Before sort: [AA, Aa, aA, aa, 11, BB, Bb, bb, 12, @!, @@!, 117, 21, !@]



After sort: [!@, 11, 117, 12, 21, @!, @@!, AA, Aa, BB, Bb, aA, aa, bb]



My expectation is: [!@, @!, @@!, 11, 117, 12, 21, aa, aA, Aa, AA, bb, Bb, BB]



Do I need to use something else other that natural sort for this?










share|improve this question




















  • 13





    so, for you 'a' comes before 'A' .. ok. well, you'll need to write your own sorting logic, but it 'll be pretty broad. you'll actually have to compare char by char. good luck.

    – Stultuske
    20 hours ago






  • 8





    The answer is in the question. Given that the natural ordering doesn't order elements as you would like to, you need something else.

    – JB Nizet
    20 hours ago













  • This is already implemented in jQuery sort. datatables.net/examples/styling/bootstrap4 But I don't the the algo they are using! Because of this UI and back-end is not in sync. Any idea on this?

    – Prabal Srivastava
    19 hours ago






  • 1





    The unicode of ! is smaller than that of @ , unicode of @ is small than 1, unicode of 1 is smaller than A, uncicode of A is smaller than a. Hope it answers for the output that you get. Now If you need sorting as per your ordering , implement your comparator.

    – nits.kk
    18 hours ago











  • @nits.kk: I am totally agree with the answer given by jaspreet. We can solve this issue by using docs.oracle.com/javase/7/docs/api/java/text/Collator.html

    – Prabal Srivastava
    18 hours ago














17












17








17


4






I was working on sorting a list of String in Java (1.8) and came to know that it is not working as expected!



I am trying the following code for sorting:



private Set<String> getTestData() {
Set<String> compRoles = new HashSet<>();
compRoles.add("AA");
compRoles.add("Aa");
compRoles.add("aA");
compRoles.add("aa");
compRoles.add("11");
compRoles.add("117");
compRoles.add("12");
compRoles.add("21");
compRoles.add("!@");
compRoles.add("@!");
compRoles.add("@@!");
compRoles.add("BB");
compRoles.add("Bb");
compRoles.add("bb");
return compRoles;
}

public static void main(String args) {
List<String> test = new ArrayList<>(new Test().getTestData());
System.out.println(test);
Collections.sort(test);
System.out.println(test);
}


Before sort: [AA, Aa, aA, aa, 11, BB, Bb, bb, 12, @!, @@!, 117, 21, !@]



After sort: [!@, 11, 117, 12, 21, @!, @@!, AA, Aa, BB, Bb, aA, aa, bb]



My expectation is: [!@, @!, @@!, 11, 117, 12, 21, aa, aA, Aa, AA, bb, Bb, BB]



Do I need to use something else other that natural sort for this?










share|improve this question
















I was working on sorting a list of String in Java (1.8) and came to know that it is not working as expected!



I am trying the following code for sorting:



private Set<String> getTestData() {
Set<String> compRoles = new HashSet<>();
compRoles.add("AA");
compRoles.add("Aa");
compRoles.add("aA");
compRoles.add("aa");
compRoles.add("11");
compRoles.add("117");
compRoles.add("12");
compRoles.add("21");
compRoles.add("!@");
compRoles.add("@!");
compRoles.add("@@!");
compRoles.add("BB");
compRoles.add("Bb");
compRoles.add("bb");
return compRoles;
}

public static void main(String args) {
List<String> test = new ArrayList<>(new Test().getTestData());
System.out.println(test);
Collections.sort(test);
System.out.println(test);
}


Before sort: [AA, Aa, aA, aa, 11, BB, Bb, bb, 12, @!, @@!, 117, 21, !@]



After sort: [!@, 11, 117, 12, 21, @!, @@!, AA, Aa, BB, Bb, aA, aa, bb]



My expectation is: [!@, @!, @@!, 11, 117, 12, 21, aa, aA, Aa, AA, bb, Bb, BB]



Do I need to use something else other that natural sort for this?







java sorting collections






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 10 hours ago









Peter Mortensen

13.8k1987113




13.8k1987113










asked 20 hours ago









Prabal SrivastavaPrabal Srivastava

158110




158110








  • 13





    so, for you 'a' comes before 'A' .. ok. well, you'll need to write your own sorting logic, but it 'll be pretty broad. you'll actually have to compare char by char. good luck.

    – Stultuske
    20 hours ago






  • 8





    The answer is in the question. Given that the natural ordering doesn't order elements as you would like to, you need something else.

    – JB Nizet
    20 hours ago













  • This is already implemented in jQuery sort. datatables.net/examples/styling/bootstrap4 But I don't the the algo they are using! Because of this UI and back-end is not in sync. Any idea on this?

    – Prabal Srivastava
    19 hours ago






  • 1





    The unicode of ! is smaller than that of @ , unicode of @ is small than 1, unicode of 1 is smaller than A, uncicode of A is smaller than a. Hope it answers for the output that you get. Now If you need sorting as per your ordering , implement your comparator.

    – nits.kk
    18 hours ago











  • @nits.kk: I am totally agree with the answer given by jaspreet. We can solve this issue by using docs.oracle.com/javase/7/docs/api/java/text/Collator.html

    – Prabal Srivastava
    18 hours ago














  • 13





    so, for you 'a' comes before 'A' .. ok. well, you'll need to write your own sorting logic, but it 'll be pretty broad. you'll actually have to compare char by char. good luck.

    – Stultuske
    20 hours ago






  • 8





    The answer is in the question. Given that the natural ordering doesn't order elements as you would like to, you need something else.

    – JB Nizet
    20 hours ago













  • This is already implemented in jQuery sort. datatables.net/examples/styling/bootstrap4 But I don't the the algo they are using! Because of this UI and back-end is not in sync. Any idea on this?

    – Prabal Srivastava
    19 hours ago






  • 1





    The unicode of ! is smaller than that of @ , unicode of @ is small than 1, unicode of 1 is smaller than A, uncicode of A is smaller than a. Hope it answers for the output that you get. Now If you need sorting as per your ordering , implement your comparator.

    – nits.kk
    18 hours ago











  • @nits.kk: I am totally agree with the answer given by jaspreet. We can solve this issue by using docs.oracle.com/javase/7/docs/api/java/text/Collator.html

    – Prabal Srivastava
    18 hours ago








13




13





so, for you 'a' comes before 'A' .. ok. well, you'll need to write your own sorting logic, but it 'll be pretty broad. you'll actually have to compare char by char. good luck.

– Stultuske
20 hours ago





so, for you 'a' comes before 'A' .. ok. well, you'll need to write your own sorting logic, but it 'll be pretty broad. you'll actually have to compare char by char. good luck.

– Stultuske
20 hours ago




8




8





The answer is in the question. Given that the natural ordering doesn't order elements as you would like to, you need something else.

– JB Nizet
20 hours ago







The answer is in the question. Given that the natural ordering doesn't order elements as you would like to, you need something else.

– JB Nizet
20 hours ago















This is already implemented in jQuery sort. datatables.net/examples/styling/bootstrap4 But I don't the the algo they are using! Because of this UI and back-end is not in sync. Any idea on this?

– Prabal Srivastava
19 hours ago





This is already implemented in jQuery sort. datatables.net/examples/styling/bootstrap4 But I don't the the algo they are using! Because of this UI and back-end is not in sync. Any idea on this?

– Prabal Srivastava
19 hours ago




1




1





The unicode of ! is smaller than that of @ , unicode of @ is small than 1, unicode of 1 is smaller than A, uncicode of A is smaller than a. Hope it answers for the output that you get. Now If you need sorting as per your ordering , implement your comparator.

– nits.kk
18 hours ago





The unicode of ! is smaller than that of @ , unicode of @ is small than 1, unicode of 1 is smaller than A, uncicode of A is smaller than a. Hope it answers for the output that you get. Now If you need sorting as per your ordering , implement your comparator.

– nits.kk
18 hours ago













@nits.kk: I am totally agree with the answer given by jaspreet. We can solve this issue by using docs.oracle.com/javase/7/docs/api/java/text/Collator.html

– Prabal Srivastava
18 hours ago





@nits.kk: I am totally agree with the answer given by jaspreet. We can solve this issue by using docs.oracle.com/javase/7/docs/api/java/text/Collator.html

– Prabal Srivastava
18 hours ago












2 Answers
2






active

oldest

votes


















29














You can use the Collator class of Java.



public static void main(String args) {
List<String> test = new ArrayList<>(new Test().getTestData());
System.out.println(test);
test.sort(Collator.getInstance(Locale.ENGLISH));
System.out.println(test);
}


Output:-



[AA, Aa, aA, aa, 11, BB, Bb, bb, 12, @!, @@!, 117, 21, !@]
[!@, @!, @@!, 11, 117, 12, 21, aa, aA, Aa, AA, bb, Bb, BB]





share|improve this answer





















  • 1





    Thanks alot (y)

    – Prabal Srivastava
    18 hours ago






  • 3





    Now days the List class has its own sort method, so going through is an unnecessary step. It is a little bit clearer to write the code like this: list.sort(Collator.getInstance(Locale.ENGLISH));.

    – Lii
    16 hours ago











  • Thanks @Lii . Updated the answer. I didn't read he was working in Java 8 so answered Collections.sort instead of list.sort

    – jaspreet
    15 hours ago






  • 2





    It not always clear what Java version to target in our answers. But Java 8 has been out almost 5 years now! I think we can safely assume that that is the standard. Now days you can even declare your list like this: var test = new ArrayList<>(new Test().getTestData());

    – Lii
    15 hours ago





















3














You could create a custom comparator for your sorting logics. After this you can use it like this:



Collections.sort(yourArrayList, new YourComparator());





share|improve this answer
























  • Appropriate your answer. I know the use of comparator and comparable. I am looking for the logic or algorithm used behind this.

    – Prabal Srivastava
    19 hours ago








  • 1





    Then you question should look like you need a custom comparator, and should contain question about sorting algortims. The easiest way is to have weights for each letter and compare them in your way.

    – ipave
    19 hours ago











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55216244%2fjava-collections-sort-method-for-string-is-not-working-properly-for-case-sensiti%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























2 Answers
2






active

oldest

votes








2 Answers
2






active

oldest

votes









active

oldest

votes






active

oldest

votes









29














You can use the Collator class of Java.



public static void main(String args) {
List<String> test = new ArrayList<>(new Test().getTestData());
System.out.println(test);
test.sort(Collator.getInstance(Locale.ENGLISH));
System.out.println(test);
}


Output:-



[AA, Aa, aA, aa, 11, BB, Bb, bb, 12, @!, @@!, 117, 21, !@]
[!@, @!, @@!, 11, 117, 12, 21, aa, aA, Aa, AA, bb, Bb, BB]





share|improve this answer





















  • 1





    Thanks alot (y)

    – Prabal Srivastava
    18 hours ago






  • 3





    Now days the List class has its own sort method, so going through is an unnecessary step. It is a little bit clearer to write the code like this: list.sort(Collator.getInstance(Locale.ENGLISH));.

    – Lii
    16 hours ago











  • Thanks @Lii . Updated the answer. I didn't read he was working in Java 8 so answered Collections.sort instead of list.sort

    – jaspreet
    15 hours ago






  • 2





    It not always clear what Java version to target in our answers. But Java 8 has been out almost 5 years now! I think we can safely assume that that is the standard. Now days you can even declare your list like this: var test = new ArrayList<>(new Test().getTestData());

    – Lii
    15 hours ago


















29














You can use the Collator class of Java.



public static void main(String args) {
List<String> test = new ArrayList<>(new Test().getTestData());
System.out.println(test);
test.sort(Collator.getInstance(Locale.ENGLISH));
System.out.println(test);
}


Output:-



[AA, Aa, aA, aa, 11, BB, Bb, bb, 12, @!, @@!, 117, 21, !@]
[!@, @!, @@!, 11, 117, 12, 21, aa, aA, Aa, AA, bb, Bb, BB]





share|improve this answer





















  • 1





    Thanks alot (y)

    – Prabal Srivastava
    18 hours ago






  • 3





    Now days the List class has its own sort method, so going through is an unnecessary step. It is a little bit clearer to write the code like this: list.sort(Collator.getInstance(Locale.ENGLISH));.

    – Lii
    16 hours ago











  • Thanks @Lii . Updated the answer. I didn't read he was working in Java 8 so answered Collections.sort instead of list.sort

    – jaspreet
    15 hours ago






  • 2





    It not always clear what Java version to target in our answers. But Java 8 has been out almost 5 years now! I think we can safely assume that that is the standard. Now days you can even declare your list like this: var test = new ArrayList<>(new Test().getTestData());

    – Lii
    15 hours ago
















29












29








29







You can use the Collator class of Java.



public static void main(String args) {
List<String> test = new ArrayList<>(new Test().getTestData());
System.out.println(test);
test.sort(Collator.getInstance(Locale.ENGLISH));
System.out.println(test);
}


Output:-



[AA, Aa, aA, aa, 11, BB, Bb, bb, 12, @!, @@!, 117, 21, !@]
[!@, @!, @@!, 11, 117, 12, 21, aa, aA, Aa, AA, bb, Bb, BB]





share|improve this answer















You can use the Collator class of Java.



public static void main(String args) {
List<String> test = new ArrayList<>(new Test().getTestData());
System.out.println(test);
test.sort(Collator.getInstance(Locale.ENGLISH));
System.out.println(test);
}


Output:-



[AA, Aa, aA, aa, 11, BB, Bb, bb, 12, @!, @@!, 117, 21, !@]
[!@, @!, @@!, 11, 117, 12, 21, aa, aA, Aa, AA, bb, Bb, BB]






share|improve this answer














share|improve this answer



share|improve this answer








edited 16 hours ago

























answered 19 hours ago









jaspreetjaspreet

774421




774421








  • 1





    Thanks alot (y)

    – Prabal Srivastava
    18 hours ago






  • 3





    Now days the List class has its own sort method, so going through is an unnecessary step. It is a little bit clearer to write the code like this: list.sort(Collator.getInstance(Locale.ENGLISH));.

    – Lii
    16 hours ago











  • Thanks @Lii . Updated the answer. I didn't read he was working in Java 8 so answered Collections.sort instead of list.sort

    – jaspreet
    15 hours ago






  • 2





    It not always clear what Java version to target in our answers. But Java 8 has been out almost 5 years now! I think we can safely assume that that is the standard. Now days you can even declare your list like this: var test = new ArrayList<>(new Test().getTestData());

    – Lii
    15 hours ago
















  • 1





    Thanks alot (y)

    – Prabal Srivastava
    18 hours ago






  • 3





    Now days the List class has its own sort method, so going through is an unnecessary step. It is a little bit clearer to write the code like this: list.sort(Collator.getInstance(Locale.ENGLISH));.

    – Lii
    16 hours ago











  • Thanks @Lii . Updated the answer. I didn't read he was working in Java 8 so answered Collections.sort instead of list.sort

    – jaspreet
    15 hours ago






  • 2





    It not always clear what Java version to target in our answers. But Java 8 has been out almost 5 years now! I think we can safely assume that that is the standard. Now days you can even declare your list like this: var test = new ArrayList<>(new Test().getTestData());

    – Lii
    15 hours ago










1




1





Thanks alot (y)

– Prabal Srivastava
18 hours ago





Thanks alot (y)

– Prabal Srivastava
18 hours ago




3




3





Now days the List class has its own sort method, so going through is an unnecessary step. It is a little bit clearer to write the code like this: list.sort(Collator.getInstance(Locale.ENGLISH));.

– Lii
16 hours ago





Now days the List class has its own sort method, so going through is an unnecessary step. It is a little bit clearer to write the code like this: list.sort(Collator.getInstance(Locale.ENGLISH));.

– Lii
16 hours ago













Thanks @Lii . Updated the answer. I didn't read he was working in Java 8 so answered Collections.sort instead of list.sort

– jaspreet
15 hours ago





Thanks @Lii . Updated the answer. I didn't read he was working in Java 8 so answered Collections.sort instead of list.sort

– jaspreet
15 hours ago




2




2





It not always clear what Java version to target in our answers. But Java 8 has been out almost 5 years now! I think we can safely assume that that is the standard. Now days you can even declare your list like this: var test = new ArrayList<>(new Test().getTestData());

– Lii
15 hours ago







It not always clear what Java version to target in our answers. But Java 8 has been out almost 5 years now! I think we can safely assume that that is the standard. Now days you can even declare your list like this: var test = new ArrayList<>(new Test().getTestData());

– Lii
15 hours ago















3














You could create a custom comparator for your sorting logics. After this you can use it like this:



Collections.sort(yourArrayList, new YourComparator());





share|improve this answer
























  • Appropriate your answer. I know the use of comparator and comparable. I am looking for the logic or algorithm used behind this.

    – Prabal Srivastava
    19 hours ago








  • 1





    Then you question should look like you need a custom comparator, and should contain question about sorting algortims. The easiest way is to have weights for each letter and compare them in your way.

    – ipave
    19 hours ago
















3














You could create a custom comparator for your sorting logics. After this you can use it like this:



Collections.sort(yourArrayList, new YourComparator());





share|improve this answer
























  • Appropriate your answer. I know the use of comparator and comparable. I am looking for the logic or algorithm used behind this.

    – Prabal Srivastava
    19 hours ago








  • 1





    Then you question should look like you need a custom comparator, and should contain question about sorting algortims. The easiest way is to have weights for each letter and compare them in your way.

    – ipave
    19 hours ago














3












3








3







You could create a custom comparator for your sorting logics. After this you can use it like this:



Collections.sort(yourArrayList, new YourComparator());





share|improve this answer













You could create a custom comparator for your sorting logics. After this you can use it like this:



Collections.sort(yourArrayList, new YourComparator());






share|improve this answer












share|improve this answer



share|improve this answer










answered 20 hours ago









ipaveipave

1889




1889













  • Appropriate your answer. I know the use of comparator and comparable. I am looking for the logic or algorithm used behind this.

    – Prabal Srivastava
    19 hours ago








  • 1





    Then you question should look like you need a custom comparator, and should contain question about sorting algortims. The easiest way is to have weights for each letter and compare them in your way.

    – ipave
    19 hours ago



















  • Appropriate your answer. I know the use of comparator and comparable. I am looking for the logic or algorithm used behind this.

    – Prabal Srivastava
    19 hours ago








  • 1





    Then you question should look like you need a custom comparator, and should contain question about sorting algortims. The easiest way is to have weights for each letter and compare them in your way.

    – ipave
    19 hours ago

















Appropriate your answer. I know the use of comparator and comparable. I am looking for the logic or algorithm used behind this.

– Prabal Srivastava
19 hours ago







Appropriate your answer. I know the use of comparator and comparable. I am looking for the logic or algorithm used behind this.

– Prabal Srivastava
19 hours ago






1




1





Then you question should look like you need a custom comparator, and should contain question about sorting algortims. The easiest way is to have weights for each letter and compare them in your way.

– ipave
19 hours ago





Then you question should look like you need a custom comparator, and should contain question about sorting algortims. The easiest way is to have weights for each letter and compare them in your way.

– ipave
19 hours ago


















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55216244%2fjava-collections-sort-method-for-string-is-not-working-properly-for-case-sensiti%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

How did Captain America manage to do this?

迪纳利

南乌拉尔铁路局