Collections.binarySearch ()
ArrayList.ensureCapcity ()
Ваш псевдокод вставляет набор новых элементов N в отсортированный список A размера S, а затем отбрасывает наименьший элемент. Используйте Collections.binarySearch () , чтобы найти точку вставки. [Прочтите примечание о влиянии на производительность, если ваш список не поддерживает RandomAccess. ArrayList поддерживает RandomAccess.]
List<Integer> l = new ArrayList<Integer>();
l.add(new Integer(2));
l.add(new Integer(3));
l.add(new Integer(6));
l.add(new Integer(9));
l.ensureCapacity(l.size()+n);
Random rand = new Random();
for (int i=0; i < n; i++) {
final Integer newInt = Integer.rand.nextInt(1000);
int insertPoint = Collections.binarySearch(l, newInt);
if (insertPoint < 0) insertPoint = -(insertPoint + 1);
l.add(insertPoint, newInt);
}
l.remove(0);
Но вы уверены, что хотите сбросить только 1 предмет? Или вы хотели вставить набор новых элементов N в отсортированный список A размера S и оставить только самые большие элементы S. В этом случае следите за минимальным значением:
int min = l.get(0);
l.ensureCapacity(l.size()+n);
Random rand = new Random();
for (int i=0; i < n; i++) {
final Integer newInt = Integer.rand.nextInt(1000);
if (newInt > min) {
int insertPoint = Collections.binarySearch(l, newInt);
if (insertPoint < 0) insertPoint = -(insertPoint + 1);
l.add(insertPoint, newInt);
}
}
Однако, если N большое, вам может быть лучше самостоятельно отсортировать N в отсортированный массив, отбросив меньший из N (0) или A (0), а затем объединить два отсортированных массива [оставлено как упражнение для читателя].
Если в конечном итоге вы используете реальный массив, см. Arrays.binarySearch и System.arraycopy .