我想知道是否有更好的方法可以做到这一点,使用数字对。我正在解决CodeAbbey上的问题。这个是
我是这样做的。 (我还在学习。)对这些数字进行排序,然后打印出原始索引位置。
public static void bSort(int[][] a) {
boolean sorted = false;
int temp;
int temp2;
while (!sorted) {
int counter = 0;
for (int i = 0; i < a.length - 1; i++) {
if (a[i][0] > a[i + 1][0]) {
temp = a[i][0];
temp2 = a[i][1];
a[i][0] = a[i + 1][0];
a[i + 1][0] = temp;
a[i][1] = a[i + 1][1];
a[i + 1][1] = temp2;
counter++;
}
}
if (counter == 0) {
sorted = true;
}
}
for (int i = 0; i < a.length; i++) {
System.out.print(a[i][1] + " ");
}
}
我一直在搜索这个: Sort a Map<Key, Value> by values (Java)但我尚未使用地图。
答案 0 :(得分:4)
您可以创建一个包含一对整数的类:
class Pair implements Comparable<Pair>{
int number, index;
@Override
public int compareTo(Pair other){
return Integer.compare(number, other.number);
}
}
然后你可以像这样对一对Pair数组进行排序:
Pair[] pairs = new Pair[]; // initialize with values
Arrays.sort(pairs);
这将根据Pair
对数组或number
进行排序,如果您之后迭代它,则可以获得每个index
的{{1}}
或者,您可以在Pair
类
Comparator
接口
Pair
并像这样使用
class PairComparator implements Comparator<Pair> {
@Override
public int compare(Pair a, Pair b) {
return Integer.compare(a.number, b.number);
}
}
答案 1 :(得分:1)
有很多方法可以解决任何特定问题。虽然在你的学习曲线中可能看起来有点早,但我建议你习惯Java 8流和lambdas。一旦你习惯了它们,你会发现它们是解决许多问题的自然方式。
所以这是一个基于流的解决方案,我将解释你的问题:
void printSortedIndexes(int[] list) {
IntStream.range(0, list.length).boxed()
.sorted(Comparator.comparingInt(n -> list[n]))
.forEach(System.out::println);
}
这可以解释为:创建一个从0到列表长度的整数流 - 1,转换为Integer
个对象的流,通过比较列表中该索引的整数对它们进行排序,然后将它们打印出来。我认为这比存储索引和手动排序更好。
答案 2 :(得分:0)
它至少可能比两个相同长度的并行阵列更好。 &#34;大概&#34;因为a[indices[i]]
- 排列方法 - 也是一个很好的解决方案。
其他答案已经提到了一些方法。
您的方法会更多地使用int[]
对
public static void bSort(int[][] a) {
boolean sorted = false;
int fromI = 0;
while (!sorted) {
boolean changed = false;
for (int i = fromI; i < a.length - 1; i++) {
int[] current = a[i];
int[] next = a[i + 1];
if (current[0] > next[0]) {
int temp = current[0];
int temp2 = current[1];
current[0] = next[0];
current[1] = next[1];
next[0] = temp;
next[1] = temp2;
if (!changed) {
fromI = i;
changed = true;
}
}
}
if (!changed) {
sorted = true;
}
}
for (int[] current : a) {
System.out.print(current[1] + " ");
}
}
在上面:
System.arrayCopy
。int[]
,但最好在循环外创建。答案 3 :(得分:0)
Map<Integer, Integer> toBeSorted = new HashMap<>();
toBeSorted.put(1, -2);
toBeSorted.put(2, -1);
toBeSorted.put(3, 8);
toBeSorted.put(4, 7);
toBeSorted.put(5, 6);
toBeSorted.put(6, 500);
toBeSorted.put(7, 4);
toBeSorted.put(8, 3);
toBeSorted.put(9, 2);
toBeSorted.put(10, 1);
final Comparator<Map.Entry<Integer, Integer>> comparator =
new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Map.Entry<Integer, Integer> o1,
Map.Entry<Integer, Integer> o2) {
return o1.getValue().compareTo(o2.getValue());
}
};//Comparator
//need a List to keep contract with Collections.sort()
final List<Map.Entry<Integer, Integer>> list =
new ArrayList<>(toBeSorted.entrySet());
//invoke sort
Collections.sort(list, comparator);
for(Map.Entry<Integer, Integer> entry : list) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
打印出来:
1 -> -2
2 -> -1
10 -> 1
9 -> 2
8 -> 3
7 -> 4
5 -> 6
4 -> 7
3 -> 8
6 -> 500