基于另一个字符串数组(Java)对2D字符串数组进行排序
正如标题所述,我希望实现一种方法,允许我根据数组对给定列的2d数组进行排序,例如,根据数组的顺序按列2对2d数组进行排序基于另一个字符串数组(Java)对2D字符串数组进行排序,java,arrays,sorting,Java,Arrays,Sorting,正如标题所述,我希望实现一种方法,允许我根据数组对给定列的2d数组进行排序,例如,根据数组的顺序按列2对2d数组进行排序 String[][] a1 = new String[][]{ {x,dog,x} {x,monkey,x} {x,cat,x} } //x being a random string String[] a2 = new String[]{dog,cat,monkey}; //Output should be: a1 = { {x,dog,x} {x
String[][] a1 = new String[][]{
{x,dog,x}
{x,monkey,x}
{x,cat,x}
}
//x being a random string
String[] a2 = new String[]{dog,cat,monkey};
//Output should be:
a1 = {
{x,dog,x}
{x,cat,x}
{x,monkey,x}
}
我不确定从这一点出发应该走什么方向,我已经研究了comparator,但我不确定在这个场景中如何实现它。任何帮助我实现这一目标的指导都将不胜感激 您需要一个依赖于
a2
数组的比较器
:
String[] a2 = new String[]{"dog", "cat", "monkey"};
Comparator<String[]> comparator = (arr1, arr2) -> {
List<String> list = Arrays.asList(a2);
int index1 = list.indexOf(arr1[1]);
int index2 = list.indexOf(arr2[1]);
return Integer.compare(index1, index2);
};
Arrays.sort(a1, comparator);
System.out.println(Arrays.deepToString(a1));
String[]a2=新字符串[]{“狗”、“猫”、“猴”};
比较器比较器=(arr1,arr2)->{
List=Arrays.asList(a2);
int index1=list.indexOf(arr1[1]);
int index2=list.indexOf(arr2[1]);
返回整数。比较(index1,index2);
};
排序(a1,比较器);
System.out.println(Arrays.deepToString(a1));
假设猫、狗和猴子是字符串对象:
Arrays.stream(a1).sorted(Comparator.comparingInt(s -> -1 * Arrays.asList(a2).indexOf(s[1]))).toArray(String[][]::new);
扩展@Ruslan answer,Comparator是正确的方法,但您可能不希望对排序中的每个比较都进行索引,因此您希望从将引用字符串映射到反向索引开始:
String[] a2 = new String[]{"dog", "cat", "monkey"};
Map<String, Integer> order = new HashMap<>();
for(int i = 0; i < a2.length; i++) {
order.put(a2[i], i);
}
Comparator<String[]> comparator = (arr1, arr2) -> {
int index1 = order.get(arr1[1]);
int index2 = order.get(arr2[1]);
return Integer.compare(index1, index2);
};
Arrays.sort(a1, comparator);
String[]a2=新字符串[]{“狗”、“猫”、“猴”};
映射顺序=新的HashMap();
对于(int i=0;i{
int index1=order.get(arr1[1]);
int index2=order.get(arr2[1]);
返回整数。比较(index1,index2);
};
排序(a1,比较器);
这里有一个片段应该对您有所帮助。
它按照a2提供的顺序,按照字符串2对数组进行排序。如果秒字符串相同,则会比较第一个字符串和第三个字符串。
注意,它确实检查空字符串
重要的是:
@覆盖
公共整数比较(字符串[]o1,字符串[]o2){
int score1=types.indexOf(o1[1])-types.indexOf(o2[1]);
如果(分数1!=0){
返回分数1;
}
int score2=o1[0]。与(o2[0])相比;
如果(分数2!=0){
返回得分2分;
}
int score3=o1[2]。与(o2[2])相比;
回归得分3分;
}
见:
导入java.util.array;
导入java.util.Comparator;
导入java.util.List;
导入java.util.stream.stream;
公共类SpecialComparatorMain实现比较器{
私有列表类型;
公共特殊比较表(列表类型){
this.types=类型;
}
公共静态void main(字符串[]args){
字符串[]a2=新字符串[]{“狗”、“猫”、“猴子”};
字符串[][]a1=新字符串[][]{
{“z”,“狗”,“x”},
{“y”,“猴子”,“x”},
{“x”,“cat”,“x”},
{“x”,“猴子”,“x”},
{“y”,“cat”,“x”},
{“z”,“猴子”,“z”},
{“z”,“猴子”,“y”},
{“z”,“猴子”,“x”},
};
//x是一个随机字符串
系统输出打印项次(“之前”);
Stream.of(a1).map(数组::toString.forEach(System.out::println);
Arrays.sort(a1,新的特殊比较格式(Arrays.asList(a2));
System.out.println(“之后”);
Stream.of(a1).map(数组::toString.forEach(System.out::println);
}
@凌驾
公共整数比较(字符串[]o1,字符串[]o2){
int score1=types.indexOf(o1[1])-types.indexOf(o2[1]);
如果(分数1!=0){
返回分数1;
}
int score2=o1[0]。与(o2[0])相比;
如果(分数2!=0){
返回得分2分;
}
int score3=o1[2]。与(o2[2])相比;
回归得分3分;
}
}
输出:
Before
[z, dog, x]
[y, monkey, x]
[x, cat, x]
[x, monkey, x]
[y, cat, x]
[z, monkey, z]
[z, monkey, y]
[z, monkey, x]
After
[z, dog, x]
[x, cat, x]
[y, cat, x]
[x, monkey, x]
[y, monkey, x]
[z, monkey, x]
[z, monkey, y]
[z, monkey, z]
嗯 我建议阅读更多关于Comparator类的内容。这就是你在这里要做的。首先用比较器写几个简单的例子。例如:创建一个像Car这样的对象,其中包含像Color和Year这样的字段,然后使用比较器按一个字段然后按另一个字段对这些对象的列表进行排序。然后,您将清楚地看到如何将其应用于当前的问题。通过一点逻辑,可以交换所有相关的单元格。@coding97我知道您想按第二列对a1进行排序。。。。但是a2数组的用途是什么呢?@Highbrainer,哎呀,这是我举的一个糟糕的例子,我希望它按照a2的顺序排序,而不考虑字母顺序。如果这有意义的话