在Java中按字符串中的2个子字符串排序
我试图根据字符串的两个组成部分对字符串列表(Java)进行反向排序,第一个是月份(需要按逆时间顺序排序),第二个是字符串开头的整数值(不代表日期,因此可能超过31)。例如:在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日] 有人能给我举个例子说明如何做到这一点吗?谢谢你需要 拆线 测试第二个子字符串是否相同 如果它们相同,则
列表日期=列表日期(“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]