0

我在 arraylist 中添加了几个数字。我想从中找到某个值。例如,我有 4、4、9、9、18。我想找到 26 的值。如果 26 > 列表中的最大值,它将显示 18,如果值为 17,它将显示 9,如果值为 5,它将显示 4。还有另一种方法来实现这个搜索,因为班轮搜索可能很慢。

search value 26

    [4,4,9,9,18] display 18
    [20,20,29,29,4] display 20
    [28,28,28,1,10] display 28

如果你有这个列表并搜索 26,它将输出第一个元素。因为第一个元素 <= 比正在搜索的值。

但目前的输出是

value2 的值:9

    public class Arraylist {

    public static ArrayList<Integer> aList;

    public static void main(String[] args) {
        aList = new ArrayList<Integer>();
        aList.add(4);
        aList.add(4);
        aList.add(9);
        aList.add(9);
        aList.add(18);
        int value = 26;
        int value2 = 0;

        for (int i = 0; i < aList.size(); i++) {
            if (aList.get(i) <= value) {          
                if (i + 1 < aList.size()) {
                    value2 = aList.get(i);
                } else if(i > aList.size()) {
                    value2 = aList.get(i);

                }
            }
        }
        System.out.println("Value of value2 : " + value2);
    }
}
4

6 回答 6

1

我已经使用数组编写了代码。您可以轻松地采用它ArrayList

int a[] = {28,28,28,1,10};
// int a[] = {20,20,29,29,4}; // other input of yours
// int a[] = {4,4,9,9,18};  

   int x = 26;

   int liVal = -1;
   for(int i=0; i<a.length;i++)
       if(x < a[i]) // if we met a value > x
       {
          if(liVal==-1) // if we could not find any largest value smaller than x
              liVal = a[i]; // return the value > x
          break;
       }
       else if(x > a[i]) // find the largest value smaller than x, 
       {
           if(liVal < a[i])
               liVal = a[i];
       }

System.out.println(liVal);
于 2013-10-25T05:17:23.773 回答
0

一个简单且未优化的版本:

int value = 26 // or whatever parameter you get
int retVal = Integer.MIN_VALUE;
for (int i : list) {
  if (i <= value && i > retVal) {
    retVal = i;
  }
}
return retVal;
于 2013-10-25T04:05:50.130 回答
0

如果数组已排序,则可以使用二进制搜索的变体。
http://en.wikipedia.org/wiki/Binary_search_algorithm

于 2013-10-25T04:06:34.903 回答
0

如果我理解正确,您想在数组中找到小于或等于value. 我会这样做:

for (int i = 0; i < aList.size(); i++) {
    if ( aList.get(i) <= value && aList.get(i) > value2) {
        value2 = aList.get(i);
    }
}

同样在你的例子中,你做value2 = 0. 如果您可以保证数组仅包含正值,则可以。否则最好使用value2 = Integer.MIN_VALUE.

最后,此代码假定数组不保证被排序,并且您只需要搜索一次。否则,二分查找可能会更高效。关于这个问题的其他答案已经展示了如何实现这一点。

于 2013-10-25T04:06:49.713 回答
0

一旦你对列表进行了排序,binarySearchCollections可以解决问题:

Collections.sort(aList)
int index = Collections.binarySearch(aList)

如果index为非负数,则在列表中找到该数字,并且index是位置。如果它是否定的,则它没有被找到,但index表明如果它在列表中它会在哪里。

并使用O(log n)运行时进行搜索。

于 2013-10-25T04:08:29.160 回答
0

根据OP的评论:

  1. 列表未排序
  2. 如果值 < 最小值返回最小值
  3. 如果值 > 最大值返回最大值
  4. 如果 min <= value <= max 返回最近的 val <= value

    public static int findValue(List<Integer> list, int value){
        int min = Integer.MAX_VALUE, nearest = Integer.MIN_VALUE;
        for(Integer v : list){
            if(v == value)
                return value;
            if(v > nearest && v < value)
                nearest = v;
            if(v < min)
                min = v;
        }
        return value < min ? min : nearest;
    }
    

作为旁注,您不需要跟踪最大值,因为如果 value > max(list),则最接近 = max。

于 2013-10-25T04:36:20.127 回答