【发布时间】:2013-04-06 09:40:44
【问题描述】:
我需要在Java中获取我的arraylist中最小值的索引值。我的arraylist 包含几个浮点数,我正在想办法获得最小浮点数的索引号,这样我就可以在代码的其他地方使用该索引号。我是初学者,所以请不要讨厌我。谢谢!
【问题讨论】:
-
我认为选择的解决方案不完整。它仍然缺少一些东西!如果最小值出现多次怎么办?毕竟是一个清单。所以我认为如果最小值的索引应该返回一个列表
我需要在Java中获取我的arraylist中最小值的索引值。我的arraylist 包含几个浮点数,我正在想办法获得最小浮点数的索引号,这样我就可以在代码的其他地方使用该索引号。我是初学者,所以请不要讨厌我。谢谢!
【问题讨论】:
您可以使用Collections.min 和List.indexOf:
int minIndex = list.indexOf(Collections.min(list));
如果你只想遍历列表一次(上面可能会遍历两次):
public static <T extends Comparable<T>> int findMinIndex(final List<T> xs) {
int minIndex;
if (xs.isEmpty()) {
minIndex = -1;
} else {
final ListIterator<T> itr = xs.listIterator();
T min = itr.next(); // first element as the current minimum
minIndex = itr.previousIndex();
while (itr.hasNext()) {
final T curr = itr.next();
if (curr.compareTo(min) < 0) {
min = curr;
minIndex = itr.previousIndex();
}
}
}
return minIndex;
}
【讨论】:
这应该使用内置函数来完成。
public static int minIndex (ArrayList<Float> list) {
return list.indexOf (Collections.min(list)); }
【讨论】:
试试这个:
public int getIndexOfMin(List<Float> data) {
float min = Float.MAX_VALUE;
int index = -1;
for (int i = 0; i < data.size(); i++) {
Float f = data.get(i);
if (Float.compare(f.floatValue(), min) < 0) {
min = f.floatValue();
index = i;
}
}
return index;
}
【讨论】:
Float.compare(f.floatValue(), min) < 0 可以更改为f < min。和min = f.floatValue() 到min = f。包装类被隐式地转换为它们的原始等价物。
f < min(来自 Float.compare 的文档:“如果 f1 在数值上等于 f2,则返回值 0;如果 f1 在数值上小于 f2,则返回值小于 0;如果 f1 在数值上大于 f2,则值大于 0")。除非你是指Float.compare(f.floatValue(), min) <= 0(即f <= min)。
有一种更简单的方法可以在数组列表中找到最小整数:
int min = array.get(0);
for (int i : array){
min = min < i ? min : i;
}
【讨论】:
public static int minIndex (ArrayList<Float> list) {
return list.indexOf (Collections.min(list));
}
System.out.println("Min = " + list.get(minIndex(list));
【讨论】:
用浮点数声明一个数组列表。
Collection.min() - 查找列表中的最小元素。
List.indexOf() - 查找最小元素的索引。
public class Test {
public static void main(String[] args) {
ArrayList<Float> ary = new ArrayList<Float>();
ary.add((float) 3.0);
ary.add((float) 6);
ary.add((float) 2);
ary.add((float) 1.3);
ary.add((float) 4.2);
int indx = minIndex(a);
System.out.println(indx);
}
public static int minIndex(ArrayList<Float> list) {
return list.indexOf(Collections.min(list));
}
}
【讨论】:
你必须遍历整个数组并保留两个辅助值:
假设您的数组名为myArray。在这段代码的末尾 minIndex 有最小值的索引。
var min = Number.MAX_VALUE; //the largest number possible in JavaScript
var minIndex = -1;
for (int i=0; i<myArray.length; i++){
if (myArray[i] < min){
min = myArray[i];
minIndex = i;
}
}
这是假设最坏的情况:一个完全随机的数组。这是一个 O(n) 算法或 order n 算法,这意味着如果您的数组中有 n 个元素,那么您必须先查看所有元素才能知道您的回答。 O(n) 算法是最糟糕的,因为它们需要大量时间来解决问题。
如果您的数组已排序或具有任何其他特定结构,则可以优化算法以更快。
话虽如此,除非您拥有包含数千个值的庞大数组,否则不必担心优化问题,因为 O(n) 算法和更快的算法之间的差异不会很明显。
【讨论】:
这就是我所做的。我首先找到最小值,然后在找到最小值之后,将其从 ArrayList 中删除。
ArrayList<Integer> a = new ArrayList<>();
a.add(3);
a.add(6);
a.add(2);
a.add(5);
while (a.size() > 0) {
int min = 1000;
for (int b:a) {
if (b < min)
min = b;
}
System.out.println("minimum: " + min);
System.out.println("index of min: " + a.indexOf((Integer) min));
a.remove((Integer) min);
}
【讨论】: