get closest value to a number in array

后端 未结 12 1679
庸人自扰
庸人自扰 2020-12-01 07:52

I have an array of positive/negative ints

int[] numbers = new int[10];
numbers[0] = 100;
numbers[1] = -34200;
numbers[2] = 3040;
numbers[3] = 400433;
numbers         


        
相关标签:
12条回答
  • 2020-12-01 08:23

    cdistance = numbers[c] - myNumber. You're not taking the absolute value of the difference. If myNumber is a lot greater than numbers[c] or if numbers[c] is negative, the comparison will register as the "minimum difference".

    Take for example the case where numbers[c] = -34200. numbers[c] - myNumber would then be -34690, a lot less than the distance.

    Also, you should initialize distance to a large value, as no solution has been found at the start.

    0 讨论(0)
  • 2020-12-01 08:25

    Here is something that i did...

    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;
    }
    

    }

    0 讨论(0)
  • 2020-12-01 08:29

    You can tweak the good old binary search and implement this efficiently.

    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);
    
    }
    
    0 讨论(0)
  • 2020-12-01 08:35
    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];
    

    Always initialize your min/max functions with the first element you're considering. Using things like Integer.MAX_VALUE or Integer.MIN_VALUE is a naive way of getting your answer; it doesn't hold up well if you change datatypes later (whoops, MAX_LONG and MAX_INT are very different!) or if you, in the future, want to write a generic min/max method for any datatype.

    0 讨论(0)
  • 2020-12-01 08:35

    I did this as an assignment for my course, and I programmed it in Ready to Program Java, so sorry if its a bit confusing.

    // 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
    
    0 讨论(0)
  • 2020-12-01 08:36

    One statement block to initialize and set the closest match. Also, return -1 if no closest match is found (empty array).

     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;
    }
    
    0 讨论(0)
提交回复
热议问题