我有一个整数的arraylist,我需要计算除最小的两个整数之外的整数的平均值。我一直在尝试不同的方法,但想想我要做的是找到min1,删除它然后找到min2然后删除它。
public double computeAverageWithoutLowest2()
{
ArrayList<Student> newscores = new ArrayList<Student>(scores);
int newtotalScores=0;
int newavg=0;
int min1 = 0;
int min2 = 0;
min1 = newscores.get(0).getScore();
for (int i = 0; i< newscores.size(); i++)
{
if (newscores.get(i).getScore() < min1)
{
min1 = newscores.get(i).getScore();
}
}
现在我想从我的arraylist中删除min1。我显然已经尝试过newscores.remove(min1);这不起作用。我怎样才能找出min1数组中的哪个点然后将其删除?
任何帮助都会非常感谢!!
好的,现在看完评论之后我把代码更改为:
ArrayList<Student> newscores = new ArrayList<Student>(scores);
int newtotalScores=0;
int newavg=0;
int minPos1 = 0;
int minPos2 = 0;
int min1 = newscores.get(0).getScore();
int min2 = newscores.get(0).getScore();
for(int i = 0; i < newscores.size(); i++)
{
if(newscores.get(i).getScore() < min1)
{
min1 = scores.get(i).getScore();
minPos1 = i;
}
}
newscores.remove(minPos1);
for(int j = 0; j < newscores.size(); j++)
{
if(newscores.get(j).getScore() < min2)
{
min2 = scores.get(j).getScore();
minPos2 = j;
}
}
newscores.remove(minPos2);
这种方法可以删除min1,但不能删除min2,而只是删除了min1删除的相同位置。
答案 0 :(得分:5)
newscores.remove(newscores.indexOf(Collections.min(newscores)));
如果要删除两个最小的项目,请执行两次。
答案 1 :(得分:1)
此解决方案比调用Collections.min()
两次更快,因为您只需要一次迭代,但您还需要保存位置以避免再次通过数组以删除最低元素。
ArrayList<Student> newscores = new ArrayList<Student>(scores);
Student min1;
Student min2;
int minPos1;
int minPos2;
for(int i = 0; i < newscores.size(); i++) {
if(newscores.get(i).getScore() < min1.getScore()) {
min1 = student;
minPos1 = i;
} else if (newscores.get(i).getScore() < min2.getScore()) {
min2 = student;
minPos2 = i;
}
}
newscores.remove(minPos1);
newscores.remove(minPos2);
另一种方法是使用像PriorityQueue
这样的有序集合,因为你输入了有序的元素而不必寻找最低的元素。
答案 2 :(得分:1)
不要从列表中删除元素,只需在迭代时保持迄今为止找到的最低两个元素,并且只在找到更低元素时将它们添加到总和中。 这样您就可以在一次迭代中计算平均值。
给你一个想法:
List<Integer> scores = Arrays.asList(2, 3, 4, 5, 0, 6, 1, 7);
int min1 = scores.get(0);
int min2 = scores.get(1);
int sum = 0;
int swap = 0;
for (int i = 2; i < scores.size(); i++) {
int score = scores.get(i);
if (score < min1) {
swap = min1;
min1 = score;
score = swap;
}
if (score < min2) {
swap = min2;
min2 = score;
score = swap;
}
System.out.println("adding " + score);
sum += score;
}
System.out.println(String.format("lowest scores: %d and %d",min1, min2));
System.out.println(sum / (scores.size() - 2.0));
打印
adding 4
adding 5
adding 3
adding 6
adding 2
adding 7
lowest scores: 0 and 1
4.5