对字符串数组列表进行排序
Sorting a list of String arrays
我收到一个字符串数组列表
String[] sa1 = {"120", "John" , "30" , "[\"science\",\"arts\"]"};
String[] sa2 = {"20", "Michael" , "29" , "[\"commerce\",\"engineering\"]"};
String[] sa3 = {"20", "Andrew" , "31" , "[\"science\",\"engineering\"]"};
我收到的列表包含这些类型的数组。
我目前使用的排序方法是:
Collections.sort(nameL, new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
return Arrays.toString(o1).compareTo(Arrays.toString(o2));
}
});
但是由于数组是字符串类型,所以这里是按照Ascii字符排序的。
问题是我不知道整数的位置
可以是:
sa1 = {"John", "120" , "30" , "[\"science\",\"arts\"]"};
但如果 sa1 是这样,那么 sa2 和 sa3 也会在相同位置有整数。
目的是按照第一个排序,如果相同则第二个以此类推:
期望输出:
{"20", "Andrew" , "31" , "[\"science\",\"engineering\"]"}
{"20", "Michael" , "29" , "[\"commerce\",\"engineering\"]"},
{"120", "John" , "30" , "[\"science\",\"arts\"]"}
如果我没弄错你需要一个多标准排序,你的比较器的技巧是索引 0 处的元素是表示整数的字符串,所以最好将它们解析为整数
List<String[]> nameL = Arrays.asList(sa1, sa2, sa3);
Collections.sort(nameL, (o1, o2) -> {
if (o1[0].equals(o2[0])) {
if (o1[1].equals(o2[1])) {
return o1[2].compareTo(o2[2]);
} else {
return o1[1].compareTo(o2[1]);
}
} else {
return Integer.compare(Integer.parseInt(o1[0]), Integer.parseInt(o2[0]));
}
});
for (String[] strings : nameL) {
System.out.println(Arrays.toString(strings));
}
你可以试试这样的
Comparator<String[]> comparator = Comparator.comparing(array -> {
try {
return Integer.parseInt(array[0]);
} catch (Exception ex) {
return array[0];
}
});
// if all arrays have equal first elements, use the next elements to sort on
String[] firstArray = yourListOfArrays.get(0);
// i starts at 1 because we've used 0 already to create the comparator
for (int i = 1; i < firstArray.length; i++) {
// i is changing on each iteration, so Java will not allow i
// to be used inside a lamda
int index = i;
comparator.thenComparing(array -> try {
return Integer.parseInt(array[index]);
} catch (Exception ex) {
return array[index];
});
}
yourListOfArrays.sort(comparator);
你可以这样做。
首先找出您的 Integer 所在的位置。参考这个你知道你的字符串在哪里。然后先按字符串排序,然后按整数排序。
public static void main(String[] args) {
String[] sa1 = {"John", "120", "30", "[\"science\",\"arts\"]"};
String[] sa2 = {"Michael", "20", "29", "[\"commerce\",\"engineering\"]"};
String[] sa3 = {"Andrew", "20", "31", "[\"science\",\"engineering\"]"};
String[] sa4 = {"Peter", "2020", "31", "[\"science\",\"engineering\"]"};
String[] sa5 = {"Bob", "99", "31", "[\"science\",\"engineering\"]"};
String[] sa6 = {"Frank", "333", "31", "[\"science\",\"engineering\"]"};
List<String[]> nameL = new ArrayList<>();
nameL.add(sa1);
nameL.add(sa2);
nameL.add(sa3);
nameL.add(sa4);
nameL.add(sa5);
nameL.add(sa6);
int positionInteger = 0;
int positionString = 0;
for (int i = 0; i < sa1.length; i++) {
if (isNumeric(sa1[i])) {
positionInteger = i;
if(i == 0){
positionString = 1;
}
break;
}
}
final int pInteger = positionInteger;
final int pString = positionString;
Collections.sort(nameL, new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
return o1[pString].compareTo(o2[pString]);
}
});
Collections.sort(nameL, new Comparator<String[]>() {
public int compare(String[] o1, String[] o2) {
if(Integer.parseInt(o1[pInteger]) - Integer.parseInt(o2[pInteger]) == 0)
{
return 0;
}
if(Integer.parseInt(o1[pInteger]) - Integer.parseInt(o2[pInteger]) > 0)
{
return 1;
}
if(Integer.parseInt(o1[pInteger]) - Integer.parseInt(o2[pInteger]) < 0)
{
return -1;
}
return 0;
}
});
for (String[] str : nameL) {
System.out.println(Arrays.toString(str));
}
}
private static boolean isNumeric(String value)
{
boolean isNumeric = false;
try
{
int probe = Integer.parseInt(value);
isNumeric = true;
}catch(Exception e)
{
// do nothing
}
return isNumeric;
}
我收到一个字符串数组列表
String[] sa1 = {"120", "John" , "30" , "[\"science\",\"arts\"]"};
String[] sa2 = {"20", "Michael" , "29" , "[\"commerce\",\"engineering\"]"};
String[] sa3 = {"20", "Andrew" , "31" , "[\"science\",\"engineering\"]"};
我收到的列表包含这些类型的数组。 我目前使用的排序方法是:
Collections.sort(nameL, new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
return Arrays.toString(o1).compareTo(Arrays.toString(o2));
}
});
但是由于数组是字符串类型,所以这里是按照Ascii字符排序的。 问题是我不知道整数的位置
可以是:
sa1 = {"John", "120" , "30" , "[\"science\",\"arts\"]"};
但如果 sa1 是这样,那么 sa2 和 sa3 也会在相同位置有整数。
目的是按照第一个排序,如果相同则第二个以此类推:
期望输出:
{"20", "Andrew" , "31" , "[\"science\",\"engineering\"]"}
{"20", "Michael" , "29" , "[\"commerce\",\"engineering\"]"},
{"120", "John" , "30" , "[\"science\",\"arts\"]"}
如果我没弄错你需要一个多标准排序,你的比较器的技巧是索引 0 处的元素是表示整数的字符串,所以最好将它们解析为整数
List<String[]> nameL = Arrays.asList(sa1, sa2, sa3);
Collections.sort(nameL, (o1, o2) -> {
if (o1[0].equals(o2[0])) {
if (o1[1].equals(o2[1])) {
return o1[2].compareTo(o2[2]);
} else {
return o1[1].compareTo(o2[1]);
}
} else {
return Integer.compare(Integer.parseInt(o1[0]), Integer.parseInt(o2[0]));
}
});
for (String[] strings : nameL) {
System.out.println(Arrays.toString(strings));
}
你可以试试这样的
Comparator<String[]> comparator = Comparator.comparing(array -> {
try {
return Integer.parseInt(array[0]);
} catch (Exception ex) {
return array[0];
}
});
// if all arrays have equal first elements, use the next elements to sort on
String[] firstArray = yourListOfArrays.get(0);
// i starts at 1 because we've used 0 already to create the comparator
for (int i = 1; i < firstArray.length; i++) {
// i is changing on each iteration, so Java will not allow i
// to be used inside a lamda
int index = i;
comparator.thenComparing(array -> try {
return Integer.parseInt(array[index]);
} catch (Exception ex) {
return array[index];
});
}
yourListOfArrays.sort(comparator);
你可以这样做。 首先找出您的 Integer 所在的位置。参考这个你知道你的字符串在哪里。然后先按字符串排序,然后按整数排序。
public static void main(String[] args) {
String[] sa1 = {"John", "120", "30", "[\"science\",\"arts\"]"};
String[] sa2 = {"Michael", "20", "29", "[\"commerce\",\"engineering\"]"};
String[] sa3 = {"Andrew", "20", "31", "[\"science\",\"engineering\"]"};
String[] sa4 = {"Peter", "2020", "31", "[\"science\",\"engineering\"]"};
String[] sa5 = {"Bob", "99", "31", "[\"science\",\"engineering\"]"};
String[] sa6 = {"Frank", "333", "31", "[\"science\",\"engineering\"]"};
List<String[]> nameL = new ArrayList<>();
nameL.add(sa1);
nameL.add(sa2);
nameL.add(sa3);
nameL.add(sa4);
nameL.add(sa5);
nameL.add(sa6);
int positionInteger = 0;
int positionString = 0;
for (int i = 0; i < sa1.length; i++) {
if (isNumeric(sa1[i])) {
positionInteger = i;
if(i == 0){
positionString = 1;
}
break;
}
}
final int pInteger = positionInteger;
final int pString = positionString;
Collections.sort(nameL, new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
return o1[pString].compareTo(o2[pString]);
}
});
Collections.sort(nameL, new Comparator<String[]>() {
public int compare(String[] o1, String[] o2) {
if(Integer.parseInt(o1[pInteger]) - Integer.parseInt(o2[pInteger]) == 0)
{
return 0;
}
if(Integer.parseInt(o1[pInteger]) - Integer.parseInt(o2[pInteger]) > 0)
{
return 1;
}
if(Integer.parseInt(o1[pInteger]) - Integer.parseInt(o2[pInteger]) < 0)
{
return -1;
}
return 0;
}
});
for (String[] str : nameL) {
System.out.println(Arrays.toString(str));
}
}
private static boolean isNumeric(String value)
{
boolean isNumeric = false;
try
{
int probe = Integer.parseInt(value);
isNumeric = true;
}catch(Exception e)
{
// do nothing
}
return isNumeric;
}