This week's book giveaway is in the Kotlin forum.
We're giving away four copies of Kotlin for Android App Development and have Peter Sommerhoff on-line!
See this thread for details.
Win a copy of Kotlin for Android App Development this week in the Kotlin forum!
  • Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Liutauras Vilda
  • Devaka Cooray
  • Jeanne Boyarsky
  • Bear Bibeault
Sheriffs:
  • Junilu Lacar
  • Paul Clapham
  • Knute Snortum
Saloon Keepers:
  • Ron McLeod
  • Tim Moores
  • Stephan van Hulst
  • salvin francis
  • Carey Brown
Bartenders:
  • Tim Holloway
  • Frits Walraven
  • Ganesh Patekar

How to sort different types of data according to their priority?  RSS feed

 
Greenhorn
Posts: 8
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I am sorting a list of objects according to a variable stored in them. Lets name that variable "sortCriteria"
A sample set of "sortCriteria" values for different objects :

400, 329, 529, "String1", 678, "String2", 588, "String3", "String1",  201, "String2"

So, basically there are 4 kind of values I can get in "sortCriteria" :
1. A numeric value
2. String1
3. String2
4. String3

Now I have to sort this data in such a way that the numeric data should be given the most priority, then "String1",  then "String2" & then "String3". i.e.
Priority of (Numeric > String1 > String2 > String3)
Note that, in output, all those numeric values should be in sorted order.

Hence, the sorted order of sample data would be -
201, 329, 400, 529, 588, 678, "String1", "String1", "String2", "String2", "String3".
Also, if multiple objects are having same "sortCriteria" values, their order should be retained.
Eg.
Let say I got 2 objects whose "sortCriteria" value is same
Object 1 : 205,
Object 2 : 205.
Then in sorted order Object1 should come before Object2.


My current Javascript implementation of sorting specific logic looks like this :


sortCriteriaArray[i] value is in this format :
["indexOfObject", "sortCriteria"]

This solution is kind of working but it's not retaining the objects order. Also, I don't feel that this is a good approach because -
1. Tomorrow, let say we have to fit in some other types of strings. In that case, we will have to change these conditional statements in getPriorityOf() function.
2. Using "Number.MAX_VALUE" to set the priority looks hacky to me.
Can there be any better way to achieve this?
 
Marshal
Posts: 62881
203
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Much of what follows may be wrong because I didn't notice you were writing JS and thought it was Java®. Sorry.

That seems a strange requirement, sorting on different types. I suggest you start by looking at the Java™ Tutorials. There you will find you create a Comparator object. But it isn't plain simple Comparator; it is a generic interface Comparator<T>. And there are very few Ts that will encompass both Strings and numeric types. (Remember your ints can be boxed to Integers.) I don't think var will work because var is reserved for local variables.
My, this isn't easy.
Now, you will find that Strings are easily mutually comparable and so are Integers, but not between types. You can call "String1".compareTo("String2") but not "String1".compareTo(588). I think you will end up casting and calling compareTo() if the two arguments are the same type, otherwise return something > 0 or < 0 depending on whether the first argument is a String.
Then you may end up throwing exceptions if you are passed something of the wrong type. The whole solution will work, but it looks pretty inelegant, because of your strange sorting criteria. Why do you have to use different types? What will happen if you add a third datatype, maybe a double? The whole thing looks to me like a recipe for trouble. Why can't you reduce all the criteria to the same datatype?

As for sorting when two values compare as “equal”: easy. Find out about “stable” sorting algorithms and use one of them.

Why are you using the == operator on reference types?
 
Campbell Ritchie
Marshal
Posts: 62881
203
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator

Tony Singh wrote:. . .  (Numeric > String1 > String2 > String3). . . .

From what you have shown you actually want (Numeric < String1 < String2 < String3).

Damn! I have just noticed that you are writing JS not Java®. That means most of what I have said will be all wrong Sorry. The bit about == is probably wrong, and maybe I am wrong about var, too. Since I hardly know any JS, who knows what else I have got wrong?
 
Marshal
Posts: 67226
170
IntelliJ IDE Java jQuery Mac Mac OS X
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
You are making this much harder than it has to be.

First you check to see if the candidates are the same type, if so you simply compare them against one another and return the result of the comparison. If they differ in type, you return the result that makes numbers higher in order than strings. That's pretty much it.
 
All of the world's problems can be solved in a garden - Geoff Lawton. Tiny ad:
RavenDB is an Open Source NoSQL Database that’s fully transactional (ACID) across your database
https://coderanch.com/t/704633/RavenDB-Open-Source-NoSQL-Database
  • Post Reply Bookmark Topic Watch Topic
  • New Topic
Boost this thread!