Java 如何打印数组中10个最小值的索引
我需要从数组中选择10个最小的数字(有2000个项目)并打印它们的索引 起初,我尝试对这个数组进行排序,并打印值数组[0到9]。这是最小的数字,但我丢失了这些值的索引,它们有一个非排序数组 第二个选项是尝试使用treeMap,它工作得很好,但当我有两个相等的键时,它只打印其中一个,但我需要打印两个键 将代码与treeMap一起使用的示例:Java 如何打印数组中10个最小值的索引,java,arrays,treemap,Java,Arrays,Treemap,我需要从数组中选择10个最小的数字(有2000个项目)并打印它们的索引 起初,我尝试对这个数组进行排序,并打印值数组[0到9]。这是最小的数字,但我丢失了这些值的索引,它们有一个非排序数组 第二个选项是尝试使用treeMap,它工作得很好,但当我有两个相等的键时,它只打印其中一个,但我需要打印两个键 将代码与treeMap一起使用的示例: TreeMap<Integer, String> treemap = new TreeMap<Integer, String>()
TreeMap<Integer, String> treemap = new TreeMap<Integer, String>();
treemap.put(2, "two");
treemap.put(1, "one");
treemap.put(3, "three");
treemap.put(6, "six");
treemap.put(6, "six2");
treemap.put(5, "five");
Collection<String> coll=treemap.values();
System.out.println("Value of the collection: "+coll);
TreeMap TreeMap=newtreemap();
树映射put(2,“2”);
树状图put(1,“一”);
树映射put(3,“三”);
树映射put(6,“6”);
treemap.put(6,“6个2”);
树状图put(5,“5”);
集合coll=treemap.values();
System.out.println(“集合值:+coll”);
到目前为止,我还没有使用treeMap,所以有可能存在一些简单的方法来修复它。还是最好用别的东西
如果有任何帮助,我将不胜感激
这是最小的数字,但我丢失了这个值的索引,这
他们有一个未排序的数组
那么为什么不创建一个类来保存这些索引呢?
然后,只需按值对数组进行排序,就可以得到关联的索引
class MyClass implements Comparable<MyClass>{
private int index;
private int value;
public MyClass(int i, int v){
this.index = i;
this.value = v;
}
@Override
public String toString(){
return "Index: "+index+" Value: "+value;
}
@Override
public int compareTo(MyClass m) {
return value - m.value;
}
}
输出(使用第二种
比较方法):
不要对裸值进行排序,而是根据值对(值,索引)
对进行排序。
然后,只取前10对,就有10个原点索引
例如,您要排序:
6 2 7 4
制作(值、索引)
对:
(6, 0) (2, 1) (7, 2) (4, 3)
关于值的排序
:
(2, 1) (4, 3) (6, 0) (7, 2)
指数:
1 3 0 2
您使用TreeMap
的方法很好。您必须进行的唯一修改如下所示:
class Pair implements Comparable<Pair> {
int value;
int index;
@Override
int compareTo(Pair other) { return value - other.value };
}
Map<Pair, String> map = new TreeMap<Pair, String>();
类对实现了可比较的{
int值;
整数指数;
@凌驾
int compareTo(Pair other){返回值-other.value};
}
Map Map=newtreemap();
您可以通过稍微修改的快速排序来实现这一点,同时对数组进行排序,如果您交换索引数组,也可以做到这一点
public class Quicksort
{
private int[] numbers;
private int number;
public void sort(int[] values) {
if (values ==null || values.length==0){
return;
}
this.numbers = values;
number = values.length;
quicksort(0, number - 1);
}
private void quicksort(int low, int high) {
int i = low, j = high;
int pivot = numbers[low + (high-low)/2];
while (i <= j) {
while (numbers[i] < pivot) {
i++;
}
while (numbers[j] > pivot) {
j--;
}
if (i <= j) {
exchange(i, j);
i++;
j--;
}
}
if (low < j)
quicksort(low, j);
if (i < high)
quicksort(i, high);
}
简短解决方案:
创建索引数组(循环初始化简单)
使用自定义比较函数对该索引数组进行排序,该函数比较其他数组中索引的值。注意:如果要按顺序打印索引,请使用稳定排序
迭代排序的索引数组,打印索引并计算不同的值(值更改时增加计数器),计数器变为11时停止
创建一个简单类来保存两个整数,或对任何值使用泛型:
class Item<T> {
public int index;
public T value;
public Item(int index, T value) {
this.index = index;
this.value = value;
}
}
输出:
index: 3, value: -1
index: 0, value: 1
index: 2, value: 3
index: 4, value: 5
index: 1, value: 7
问题是“打印具有最小值的10个索引”(可能一些具有相同值的索引未打印),还是“打印具有10个最小值的索引”(可能超过10个,即使整个数组只有10个或更少的不同值),这是正确的。感谢更好的主题名称:)这将很容易阅读,并附有一些说明,澄清逻辑是否可以将其更改为双值?我所有更改答案的尝试都以错误告终。@PetrŠrámek是的,请参阅对答案的修改是否可以将其更改为双值?我所有更改它的尝试都以错误告终。@PetrŠrámek是的,当然,只需将值字段更改为原语double
,并在类double
中使用静态方法compare
,即int compareValue=double.compare(value,m.value)代码>在比较到方法中。谢谢。。。在添加此评论之前,我尝试过它,但我可能有一些错误,因为现在它运行良好。@PetrŠrámek不客气。很酷,现在就可以了=)
public class Quicksort
{
private int[] numbers;
private int number;
public void sort(int[] values) {
if (values ==null || values.length==0){
return;
}
this.numbers = values;
number = values.length;
quicksort(0, number - 1);
}
private void quicksort(int low, int high) {
int i = low, j = high;
int pivot = numbers[low + (high-low)/2];
while (i <= j) {
while (numbers[i] < pivot) {
i++;
}
while (numbers[j] > pivot) {
j--;
}
if (i <= j) {
exchange(i, j);
i++;
j--;
}
}
if (low < j)
quicksort(low, j);
if (i < high)
quicksort(i, high);
}
private void exchange(int i, int j) {
int temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
// NOTICE THIS exchange the indexes as well
temp = index_numbers[i];
index_numbers[i] = index_numbers[j];
index_numbers[j] = temp;
}
}
class Item<T> {
public int index;
public T value;
public Item(int index, T value) {
this.index = index;
this.value = value;
}
}
double[] original = { 1.0, 7.0, 3.0, -1.0, 5.0 };
List<Item> l = new ArrayList<Item<Double>>();
for (int i = 0; i < original.length; i++)
l.add(new Item<Double>(i, original[i]));
Collections.sort(l, new Comparator<Item<Double>>() {
public int compare(Item o1, Item o2) {
return Double.compare(o1.value, o2.value);
}
});
for (int i = 0; i < 10 && i < l.size(); i++) {
System.out.printf("index: %f, value: %f%n",
l.get(i).index, l.get(i).value);
}
index: 3, value: -1
index: 0, value: 1
index: 2, value: 3
index: 4, value: 5
index: 1, value: 7