Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中按字符串中的2个子字符串排序_Java_Sorting_Comparator - Fatal编程技术网

在Java中按字符串中的2个子字符串排序

在Java中按字符串中的2个子字符串排序,java,sorting,comparator,Java,Sorting,Comparator,我试图根据字符串的两个组成部分对字符串列表(Java)进行反向排序,第一个是月份(需要按逆时间顺序排序),第二个是字符串开头的整数值(不代表日期,因此可能超过31)。例如: 列表日期=列表日期(“12月13日”、“6月44日”、“12月12日”、“8月103日”、“9月22日”、“9月23日”) 订购后,应返回: [12月13日、12月12日、9月23日、9月22日、8月103日、6月44日] 有人能给我举个例子说明如何做到这一点吗?谢谢你需要 拆线 测试第二个子字符串是否相同 如果它们相同,则

我试图根据字符串的两个组成部分对字符串列表(Java)进行反向排序,第一个是月份(需要按逆时间顺序排序),第二个是字符串开头的整数值(不代表日期,因此可能超过31)。例如:

列表日期=列表日期(“12月13日”、“6月44日”、“12月12日”、“8月103日”、“9月22日”、“9月23日”)

订购后,应返回:

[12月13日、12月12日、9月23日、9月22日、8月103日、6月44日]

有人能给我举个例子说明如何做到这一点吗?谢谢

你需要

  • 拆线
  • 测试第二个子字符串是否相同
  • 如果它们相同,则比较日期
  • 对列表进行排序的代码可能如下所示:

    private static final String[]MONTHS={“Jan”、“Feb”、…};
    private int getMonthNumeric(字符串缩写){
    对于(int i=0;i{
    字符串[]split1=a.split(“”);
    字符串[]split2=b.split(“”);
    如果(拆分1[1]。等于(拆分2[1])){
    返回Integer.parseInt(split1[0])-Integer.parseInt(split2[0]);
    }否则{
    返回getMonthNumeric(split1[1])-getMonthNumeric(split1[1]);
    }
    }
    );
    
    为排序流方法提供自己的比较器。 下面的示例比较月份索引。如果它们相等(差值为0),则比较数字。 检查一下

    导入java.text.DateFormatSymbols;
    导入java.util.array;
    导入java.util.List;
    导入java.util.stream.collector;
    公开课考试{
    /*【一月、二月、三月、四月、五月、六月、七月、八月、九月、十月、十一月、十二月】*/
    静态字符串[]shortMonths=新的DateFormatSymbols().getShortMonths();
    静态整型getMonthIndex(字符串字){
    返回Arrays.asList(shortMonths).indexOf(word.substring(0,Math.min(word.length(),3));
    }
    公共静态void main(字符串[]args){
    列表日期=数组。asList(“12月13日”、“6月44日”、“12月12日”、“8月103日”、“9月22日”、“9月23日”);
    dates=dates.stream().排序((s1,s2)->{
    字符串[]a1=s1。拆分(“”);
    字符串[]a2=s2。拆分(“”);
    int comp=getMonthIndex(a2[1])-(getMonthIndex(a1[1]);
    返回comp!=0?comp:a2[0]。比较(a1[0]);
    }).collect(Collectors.toList());
    系统输出打印项次(日期);
    }
    }
    

    将产生
    [13十二月、12十二月、23九月、22九月、103八月、44六月]

    以下是一种方法。它使用一些功能获取当月的值

    List<String> dates = new ArrayList<>(List.of("13 Dec",
            "44 June", "12 Dec", "103 Aug", "22 Sep", "23 Sep"));
    

    比较器可以(1)拆分字符串(2)测试第二个子字符串是否相同(3)如果它们相同,则比较天数,如果没有,则使用数组将月份名称与月份名称或类似名称进行比较。如何使用另一个数组比较月份名称?月份始终是3个字母,还是可以是完整的月份名称?如果您有一个包含所有月份缩写形式的数组,则可以使用线性搜索来查找索引和比较是的。月份总是3个字母。为什么只反转月份,而不反转天数?当您使用
    java.time
    API时,您可以让它完成整个工作:
    DateTimeFormatter f=new DateTimeFormatterBuilder().parselenent().appendPattern(“d MMM”).toFormatter(Locale.US);dates.sort(Comparator.comparating((String s)-> F.PARSE(S),比较器。比较长((TimeAccess OR)-A.GET(TooField.Munthyof OFAY))。然后比较(A->GATOLIN(THOOCOLDER,DYAYOFO月))RealSead();Holger First,第二个注释。没有考虑这一点,因为该值不是月份的月份。至于排序的顺序。OP称第一个月份是月份。(需要按逆时间顺序排列),第二个是字符串开头的整数值(不代表日期,因此可能超过31)。我认为这是反转月份的唯一要求。即使当我查看所需的输出时,我也掩盖了它。但我的疯狂是有原因的。仔细查看您的评论后,我发现了我最初想要的。一种只拆分字符串一次,然后在随后的比较中使用的方法。因此我ted我的回答反映了这一点。通过回答这个问题,我学到了一些东西。这是我的一个肯定的胜利。再次感谢!
    
    split1[1].equals(split2[1])
    
    Integer.parseInt(split1[0])<Integer.parseInt(split2[0]);
    
    private static final String[] MONTHS={"Jan","Feb",...};
    private int getMonthNumeric(String abbr){
        for(int i=0;i<MONTHS.length();i++){
            if(abbr.equals(MONTHS[i]){
                return i;
            }
        }
        return -1;
    }
    //in your comparator
    getMonthNumeric(split1[1])<getMonthNumeric(split1[1])
    
    import java.text.DateFormatSymbols;
    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Collectors;
    
    public class Test {
    
        /* [Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec, ] */
        static String[] shortMonths = new DateFormatSymbols().getShortMonths();
        static int getMonthIndex(String word) {
            return Arrays.asList(shortMonths).indexOf(word.substring(0, Math.min(word.length(), 3)));
        }
    
        public static void main(String[] args) {
            List<String> dates = Arrays.asList("13 Dec", "44 June", "12 Dec", "103 Aug", "22 Sep", "23 Sep");
    
            dates = dates.stream().sorted((s1, s2) -> {
                String[] a1 = s1.split(" ");
                String[] a2 = s2.split(" ");
                int comp = getMonthIndex(a2[1]) - (getMonthIndex(a1[1]));
                return comp != 0 ? comp : a2[0].compareTo(a1[0]);
            }).collect(Collectors.toList());
    
            System.out.println(dates);
        }
    
    }
    
    List<String> dates = new ArrayList<>(List.of("13 Dec",
            "44 June", "12 Dec", "103 Aug", "22 Sep", "23 Sep"));
    
    Function<String, Integer> monNum = month -> DateTimeFormatter
            .ofPattern("MMM").parse(month)
            .get(ChronoField.MONTH_OF_YEAR);
    
    Comparator<String> comp =
        Comparator.comparing((String str) -> str.split("\\s+"),
            Comparator.comparingInt((String[] a) -> monNum.apply(a[1]))
                .thenComparing(a -> Integer.parseInt(a[0])))
             .reversed();
            
    dates.sort(comp);
    System.out.println(dates);
    
    
    [13 Dec, 12 Dec, 23 Sep, 22 Sep, 103 Aug, 44 June]