I’m trying to make a program that consists of an array of Strings . now I need to sort them in order ‘PJ’, ‘GHS’, ‘FJ’, ‘PAS’ and date.
input :
JavaScript
x
listOfStringArrays.add(new String[] { "200608", "FJ" });
listOfStringArrays.add(new String[] { "200608", "PJ" });
listOfStringArrays.add(new String[] { "200609", "FJ" });
listOfStringArrays.add(new String[] { "200609", "PJ" });
listOfStringArrays.add(new String[] { "200610", "FJ" });
listOfStringArrays.add(new String[] { "200610", "PJ" });
listOfStringArrays.add(new String[] { "200610", "PAS" });
listOfStringArrays.add(new String[] { "200610", "GHS" });
listOfStringArrays.add(new String[] { "200609", "SHO" });
listOfStringArrays.add(new String[] { "200615", "FIA" });
listOfStringArrays.add(new String[] { "200611", "GHS" });
listOfStringArrays.add(new String[] { "200615", "FIA" });
listOfStringArrays.add(new String[] { "200609", "PAS" });
listOfStringArrays.add(new String[] { "200607", "FIA" });
output:
//Always ‘PJ’, ‘GHS’, ‘FJ’ then ‘PAS’
JavaScript
listOfStringArrays.add(new String[] { "200607", "FIA" });
listOfStringArrays.add(new String[] { "200608", "PJ" });
listOfStringArrays.add(new String[] { "200608", "FJ" });
listOfStringArrays.add(new String[] { "200609", "PJ" });
listOfStringArrays.add(new String[] { "200609", "FJ" });
listOfStringArrays.add(new String[] { "200609", "PAS" });
listOfStringArrays.add(new String[] { "200609", "SHO" });
listOfStringArrays.add(new String[] { "200610", "PJ" });
listOfStringArrays.add(new String[] { "200610", "GHS" });
listOfStringArrays.add(new String[] { "200610", "FJ" });
listOfStringArrays.add(new String[] { "200610", "PAS" });
listOfStringArrays.add(new String[] { "200615", "FIA" });
Advertisement
Answer
You should consider using custom java classes instead of String Array. Find below an example to do it .
JavaScript
public static void main(String[] args) {
List<String[]> listOfStringArrays = getArrayOfStrings();
new SortArrayOfStrings().sort(listOfStringArrays);
listOfStringArrays.stream().forEach(s -> System.out.println(String.format("%s %s", s[0], s[1])));
}
private static List<String[]> getArrayOfStrings() {
List<String[]> listOfStringArrays = new LinkedList<>();
listOfStringArrays.add(new String[]{"200608", "FJ"});
listOfStringArrays.add(new String[]{"200608", "PJ"});
listOfStringArrays.add(new String[]{"200609", "FJ"});
listOfStringArrays.add(new String[]{"200609", "PJ"});
listOfStringArrays.add(new String[]{"200610", "FJ"});
listOfStringArrays.add(new String[]{"200610", "PJ"});
listOfStringArrays.add(new String[]{"200610", "PAS"});
listOfStringArrays.add(new String[]{"200610", "GHS"});
// listOfStringArrays.add(new String[]{"200609", "SHO"});
// listOfStringArrays.add(new String[]{"200615", "FIA"});
listOfStringArrays.add(new String[]{"200611", "GHS"});
// listOfStringArrays.add(new String[]{"200615", "FIA"});
listOfStringArrays.add(new String[]{"200609", "PAS"});
// listOfStringArrays.add(new String[]{"200607", "FIA"});
return listOfStringArrays;
}
private void sort(List<String[]> listOfStringArrays) {
Collections.sort(listOfStringArrays, new Comparator<>() {
@Override
public int compare(String[] o1, String[] o2) {
if (o1.length != 2 && o2.length != 2) {
throw new IllegalArgumentException("String array contains more than two values");
}
int comp = getValue(o1[1]).compareTo(getValue(o2[1]));
if (comp == 0) {
DateFormat df = new SimpleDateFormat("yyMMdd");
try {
return df.parse(o1[0]).compareTo(df.parse(o2[0]));
} catch (ParseException e) {
throw new IllegalArgumentException("Unable to parse date", e);
}
}
return comp;
}
});
}
public Integer getValue(String s) {
// TODO add FIA and SHO
List<String> values = Arrays.asList("PJ", "GHS", "FJ", "PAS");
for (int i = 0; i < values.size(); i++) {
if (values.get(i).equals(s)) {
return i;
}
}
return -1;
}
}