【问题标题】:get closest value to a number in array获取最接近数组中数字的值
【发布时间】:2012-10-30 09:39:06
【问题描述】:

我有一个正/负整数数组

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,我会从号码 500 中取回第 4 项,这样最好的方法是什么?

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

这行不通。有什么好的方法可以做到这一点吗?

【问题讨论】:

  • cdistance = numbers[c] - myNumber。您没有采用绝对值。
  • 您需要从distance 开始,它等于某个非常大的数字。否则,cdistance 永远不会小于它。另外,比较之前需要取cdistance的绝对值。

标签: java arrays


【解决方案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];

始终使用您正在考虑的第一个元素初始化您的最小/最大函数。使用Integer.MAX_VALUEInteger.MIN_VALUE 之类的东西是获得答案的幼稚方法;如果您稍后更改数据类型(哎呀,MAX_LONGMAX_INT 非常不同!)或者如果您将来想为 any 数据类型。

【讨论】:

  • -1 对于“幼稚”的评论。保证用最少的代码给你正确的答案。你描述的场景基本上都是镀金的。
  • @Chris Hayes Hai-我有一个类似的数组。 [0, 0, 215, 230, 243, 252] 如果我的号码是 225。我想分配 215(theNumber)。在上面它给了我 230,因为它是最接近的。在这种情况下如何得到这个?谢谢。
【解决方案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。您没有采用差异的绝对值。如果myNumbernumbers[c] 大很多,或者numbers[c] 为负数,则比较将记录为“最小差异”。

    numbers[c] = -34200的情况为例。 numbers[c] - myNumber 将是 -34690,比 distance 小很多。

    另外,您应该将distance 初始化为一个较大的值,因为一开始还没有找到解决方案。

    【讨论】:

      【解决方案5】:

      您可以调整旧的二进制搜索并有效地实现它。

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

      【讨论】:

      【解决方案6】:
      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));
      

      【讨论】:

        【解决方案7】:

        一个语句块来初始化和设置最接近的匹配。此外,如果没有找到最接近的匹配项(空数组),则返回 -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;
        }
        

        【讨论】:

        • 为什么要使用嵌套类,我只是好奇!
        【解决方案8】:
        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;
        }
        

        【讨论】:

          【解决方案9】:

          Kotlin 很有帮助

          fun List<Int>.closestValue(value: Int) = minBy { abs(value - it) }
          
          val values = listOf(1, 8, 4, -6)
          
          println(values.closestValue(-7)) // -6
          println(values.closestValue(2)) // 1
          println(values.closestValue(7)) // 8
          
          

          列表不需要排序

          【讨论】:

            【解决方案10】:

            这是我的课程作业,我用 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
            

            【讨论】:

              【解决方案11】:

              Kotlin - TreeSet lower 方法返回此中最大的元素 设置严格小于给定元素,如果没有这样的元素,则为 null 元素。

              import java.util.*
              
              fun printLowest(number: Int) {
                  val numbers = listOf(100, 90, 50, -100, -200, 532, 6584, -945)
                  val lower = TreeSet(numbers).lower(number)
                  println(lower)
              }
              
              printLowest(100) // Prints 90
              

              【讨论】:

                【解决方案12】:
                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]));
                            }
                        }        
                    }
                }
                

                【讨论】:

                • 获取数组并在java中计算目标值
                【解决方案13】:

                这是我做的事情......

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

                }

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2012-01-24
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-06-30
                  相关资源
                  最近更新 更多