Получить самое близкое значение к числу в массиве
У меня есть массив положительных/отрицательных ints
int[] numbers = new int[10];
numbers[0] = 100;
numbers[1] = -34200;
numbers[2] = 3040;
numbers[3] = 400433;
numbers[4] = 500;
numbers[5] = -100;
numbers[6] = -200;
numbers[7] = 532;
numbers[8] = 6584;
numbers[9] = -945;
Теперь я хотел бы протестировать другой int против этого массива и вернуть число, которое ближе всего к int.
Например, если я использовал номер 490
i, я бы вернул элемент # 4 из числа 500
, что лучший способ сделать что-то вроде этого?
int myNumber = 490;
int distance = 0;
int idx = 0;
for(int c = 0; c < numbers.length; c++){
int cdistance = numbers[c] - myNumber;
if(cdistance < distance){
idx = c;
distance = cdistance;
}
}
int theNumber = numbers[idx];
Это не работает. Любые предложения по хорошему методу сделать это?
Ответы
Ответ 1
int myNumber = 490;
int distance = Math.abs(numbers[0] - myNumber);
int idx = 0;
for(int c = 1; c < numbers.length; c++){
int cdistance = Math.abs(numbers[c] - myNumber);
if(cdistance < distance){
idx = c;
distance = cdistance;
}
}
int theNumber = numbers[idx];
Всегда инициализируйте свои функции min/max первым элементом, который вы рассматриваете. Использование таких вещей, как Integer.MAX_VALUE
или Integer.MIN_VALUE
является наивный способ получить ответ; он не сильно уместится, если позже вы измените типы данных (крики, MAX_LONG
и MAX_INT
сильно отличаются!), или если вы в будущем захотите написать общий min/max
метод для любого типа данных.
Ответ 2
В Java 8:
List<Integer> list = Arrays.stream(numbers).boxed().collect(Collectors.toList());
int n = 490;
int c = list.stream()
.min(Comparator.comparingInt(i -> Math.abs(i - n)))
.orElseThrow(() -> new NoSuchElementException("No value present"));
Изначально вы можете использовать List
вместо Array
(списки обладают гораздо большей функциональностью).
Ответ 3
ты очень близок. Я думаю, что начальное значение "distance" должно быть большим числом вместо 0. И используйте абсолютное значение для cdistance.
Ответ 4
cdistance = numbers[c] - myNumber
. Вы не принимаете абсолютную величину разницы. Если myNumber
намного больше, чем numbers[c]
, или если numbers[c]
отрицательно, сравнение будет регистрироваться как "минимальная разница".
Возьмем, к примеру, случай, когда numbers[c] = -34200
. numbers[c] - myNumber
будет тогда -34690, что намного меньше, чем distance
.
Кроме того, вы должны инициализировать distance
до большого значения, так как в начале поиска не было найдено.
Ответ 5
Один блок оператора для инициализации и установки ближайшего совпадения. Кроме того, return -1, если не найдено ближайшего совпадения (пустой массив).
protected int getClosestIndex(final int[] values, int value) {
class Closest {
Integer dif;
int index = -1;
};
Closest closest = new Closest();
for (int i = 0; i < values.length; ++i) {
final int dif = Math.abs(value - values[i]);
if (closest.dif == null || dif < closest.dif) {
closest.index = i;
closest.dif = dif;
}
}
return closest.index;
}
Ответ 6
Я сделал это как задание для своего курса, и я запрограммировал его в Ready to Program Java, поэтому извините, если он немного запутан.
// The "Ass_1_B_3" class.
import java.awt.*;
import hsa.Console;
public class Ass_1_B_3
{
static Console c; // The output console
public static void main (String[] args)
{
c = new Console ();
int [] data = {3, 1, 5, 7, 4, 12, -3, 8, -2};
int nearZero = 0;
int temp = 0;
int temp2 = data[0];
for (int i = 0; i < data.length; i++)
{
temp = Math.abs (data[i]);
nearZero = temp2;
if (temp < temp2)
{
temp2 = temp;
nearZero = data[i];
}
}
c.println ("The number closest to zero is: " + nearZero);
// Place your program here. 'c' is the output console
} // main method
} // Ass_1_B_3 class
Ответ 7
public int getClosestToTarget(int target, int[] values) {
if (values.length < 1)
throw new IllegalArgumentException("The values should be at least one element");
if (values.length == 1) {
return values[0];
}
int closestValue = values[0];
int leastDistance = Math.abs(values[0] - target);
for (int i = 0; i < values.length; i++) {
int currentDistance = Math.abs(values[i] - target);
if (currentDistance < leastDistance) {
closestValue = values[i];
leastDistance = currentDistance;
}
}
return closestValue;
}
Ответ 8
Вы можете настроить старый добрый бинарный поиск и эффективно реализовать его.
Arrays.sort(numbers);
nearestNumber = nearestNumberBinarySearch(numbers, 0, numbers.length - 1, myNumber);
private static int nearestNumberBinarySearch(int[] numbers, int start, int end, int myNumber) {
int mid = (start + end) / 2;
if (numbers[mid] == myNumber)
return numbers[mid];
if (start == end - 1)
if (Math.abs(numbers[end] - myNumber) >= Math.abs(numbers[start] - myNumber))
return numbers[start];
else
return numbers[end];
if(numbers[mid]> myNumber)
return nearestNumberBinarySearch(numbers, start,mid, myNumber);
else
return nearestNumberBinarySearch(numbers,mid, end, myNumber);
}
Ответ 9
int valueToFind = 490;
Map<Integer, Integer> map = new HashMap();
for (int i = 0, i < numbers.length; i++){
map.put(Math.abs(numbers[i] - valueToFind), numbers[i]);
}
List<Integer> keys = new ArrayList(map.keySet());
Collections.sort(keys);
return map.get(keys.get(0));
Ответ 10
public int nearnum(int myNumber,int[] numbers)
{
int distance = Math.abs(numbers[0] - myNumber);
int idx = 0;
for(int c = 1; c < numbers.length; c++){
int cdistance = Math.abs(numbers[c] - myNumber);
if(cdistance < distance){
idx = c;
distance = cdistance;
}
}
return numbers[idx];
}
Ответ 11
public class Main
{
public static void main(String[] args)
{
int[] numbers = {6,5,10,1,3,4,2,14,11,12};
for(int i =0; i<numbers.length; i++)
{
sum(numbers, i, numbers[i], 12, String.valueOf(numbers[i]));
}
}
static void sum(int[] arr, int i, int sum, int target, String s)
{
int flag = 0;
for(int j = i+1; j<arr.length; j++)
{
if(arr[i] == target && flag==0)
{
System.out.println(String.valueOf(arr[i]));
flag =1;
}
else if(sum+arr[j] == target)
{
System.out.println(s+" "+String.valueOf(arr[j]));
}
else
{
sum(arr, j, sum+arr[j], target, s+" "+String.valueOf(arr[j]));
}
}
}
}
Ответ 12
Вот что я сделал...
import javax.swing.JOptionPane;
public class NearestNumber {
public static void main(String[] arg)
{
int[] array={100,-3420,3040,400433,500,-100,-200,532,6584,-945};
String myNumberString =JOptionPane.showInputDialog(null,"Enter the number to test:");
int myNumber = Integer.parseInt(myNumberString);
int nearestNumber = findNearestNumber(array,myNumber);
JOptionPane.showMessageDialog(null,"The nearest number is "+nearestNumber);
}
public static int findNearestNumber(int[] array,int myNumber)
{
int min=0,max=0,nearestNumber;
for(int i=0;i<array.length;i++)
{
if(array[i]<myNumber)
{
if(min==0)
{
min=array[i];
}
else if(array[i]>min)
{
min=array[i];
}
}
else if(array[i]>myNumber)
{
if(max==0)
{
max=array[i];
}
else if(array[i]<max)
{
max=array[i];
}
}
else
{
return array[i];
}
}
if(Math.abs(myNumber-min)<Math.abs(myNumber-max))
{
nearestNumber=min;
}
else
{
nearestNumber=max;
}
return nearestNumber;
}
}