【问题标题】:Sort List of Strings arrays in JavaJava中的字符串数组排序列表
【发布时间】:2021-04-02 06:28:53
【问题描述】:

我正在尝试制作一个由 Strings 数组组成的程序。 现在我需要按“PJ”、“GHS”、“FJ”、“PAS”和日期的顺序对它们进行排序。

输入:

    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" });

输出:
//总是'PJ'、'GHS'、'FJ'然后是'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" });

【问题讨论】:

  • 除了您选择的四个以外的其他值呢?在您的示例中,“FIA”和“SHO”?
  • 创建一个适当的类,而不是使用String[] 来表示记录。
  • @PM77-1 第一次我必须按日期对它们进行排序,然后按四个值之一,如果在某个日期我有四个值中的一个以上,然后按顺序“PJ”对它们进行排序, 'GHS', 'FJ' , 'PAS'

标签: java arrays string sorting arraylist


【解决方案1】:

我建议您真正创建一个适当的课程,正如您的问题的一个 cmets 中所述。如果重要的话,仍然可以使用您的结构对数据集进行排序。考虑看看这个问题:

How to use Comparator in Java to sort

如果您将该答案应用于您的问题,您可以获得:

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)
     }
 });

【讨论】:

    【解决方案2】:

    您应该考虑使用自定义 java 类而不是字符串数组。 在下面找到一个例子。

        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;
        }
    }
    

    【讨论】:

    • new SortArrayOfStrings().sort(listOfStringArrays); 你希望它实现什么?
    • 抱歉,这段代码包含在一个名为 SortArrayOfStrings 的类中。我只粘贴了班级正文:-)。它应该只调用排序方法:-)
    • @codiallo 谢谢你的问题,在 getValue 方法中我不能添加 FIA 和 SHO,因为它可以是许多其他值......我必须按日期排序它们然后按字符串值
    猜你喜欢
    • 2016-05-07
    • 2020-07-17
    • 2013-03-11
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 2017-09-26
    • 2017-08-11
    相关资源
    最近更新 更多