I'm trying to achieve sql like sorting for each attribute for a list of objects. Some thing like this - but with java
SELECT Id, CompanyName, City, Country FROM Supplier WHERE Country IN ('USA', 'Japan', 'Germany') ORDER BY Country ASC, CompanyName DESC
I have looked into/used libraries like ComparisonChain, lambdaj to acheive this behavior. But both lack the feature to add multiple sort orders like SQL. sorting country as ascending and name as descending. I have even tried to write my own code where; based on the sort value I send the -ve of the return value but for some reason that doesn't give the desired result.
public int compare(Item a, Item b)
{
int compareOwner = a.getOwner().compareTo(b.getOwner());
int compareCreated = a.getCreationTime().compareTo(b.getCreationTime());
Map<String, Integer> compareMap = new HashMap<String, Integer>();
compareMap.put("user", compareOwner);
compareMap.put("creationTime", compareCreated);
Map<String, Object> map = a.getProperties();
for (Map.Entry<String, Object> ent : map.entrySet())
{
if (b.getCustomProperties().containsKey(ent.getKey()))
{
Object a1 = ent.getValue();
Object b1 = b.Properties().get(ent.getKey());
if (a1 instanceof String && b1 instanceof String)
{
String val = (String) ent.getValue();
int cmp = val.compareTo((String) b.getCustomProperties().get(ent.getKey()));
compareMap.put(ent.getKey(), cmp);
}
else if (a1 instanceof Integer && b1 instanceof Integer)
{
Integer val = (Integer) ent.getValue();
int cmp = val.compareTo((Integer) b.getCustomProperties().get(ent.getKey()));
compareMap.put(ent.getKey(), cmp);
}
else if (a1 instanceof Float && b1 instanceof Float)
{
Float val = (Float) ent.getValue();
int cmp = val.compareTo((Float) b.getCustomProperties().get(ent.getKey()));
compareMap.put(ent.getKey(), cmp);
}
else if (a1 instanceof Double && b1 instanceof Double)
{
Double val = (Double) ent.getValue();
int cmp = val.compareTo((Double) b.getCustomProperties().get(ent.getKey()));
compareMap.put(ent.getKey(), cmp);
}
else if (a1 instanceof Date && b1 instanceof Date)
{
Date val = (Date) ent.getValue();
int cmp = val.compareTo((Date) b.getCustomProperties().get(ent.getKey()));
compareMap.put(ent.getKey(), cmp);
}
}
}
int returnValue = 0;
for (Map.Entry<String, Boolean> entry : fields.entrySet())
{
if (compareMap.get(entry.getKey()) != null && compareMap.get(entry.getKey()) == 0)
{
continue;
}
else if (compareMap.get(entry.getKey()) != null)
{
if (entry.getValue() == false)
{
return returnValue = -returnValue;
}
return returnValue = compareMap.get(entry.getKey());
}
else
{
continue;
}
}
return returnValue;
}
Where the fields variable is map of attributes and their corresponding orders.
Are there any alternative libraries or anyway to improve this comparator to support multi ordering.