-4

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 :

    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'

    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" });
PM 77-1
  • 12,933
  • 21
  • 68
  • 111
Idir
  • 31
  • 6

2 Answers2

0

You should consider using custom java classes instead of String Array. Find below an example to do it .

    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;
    }
}
codiallo
  • 173
  • 4
  • `new SortArrayOfStrings().sort(listOfStringArrays);` what do you expect it to achieve? – PM 77-1 Dec 23 '20 at 17:22
  • Ah sorry this code was included in a class called SortArrayOfStrings. I only pasted the class body :-). It should just call the sort method :-) – codiallo Dec 23 '20 at 17:23
  • @codiallo thank you the problème that in the getValue methode i can't add FIA and SHO because it can be many others values ... and i have to order them by date then by string values – Idir Dec 23 '20 at 19:06
0

I'd suggest you really create a proper class, as it was stated in one of comments to your question. It is still possible to sort your dataset using your structure, if it is important. Consider looking at this question:

How to use Comparator in Java to sort

If you apply that answer to your question, you can get :

Collections.sort(listOfStringArrays,new Comparator<String[]>(){
   @Override
   public int compare(final String[] lhs,String[] rhs) {
     //TODO return 1 if rhs should be before lhs 
     //     return -1 if lhs should be before rhs
     //     return 0 otherwise (meaning the order stays the same)
     }
 });
Ivan P.
  • 832
  • 2
  • 9
  • 26