2013-10-25 68 views
0

我在arraylist中添加了少量编号。我想从中找到一定的价值。例如我有4,4,9,9,18。我想找到26的值。如果26>列表中最大的值,它将显示18,如果值是17,它将显示9,如果值是5,它将显示4.还有另一种方法来实现这一点搜索,因为班轮搜索可能会很慢。Java在arraylist中查找值

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,它会输出第一个元素。因为第一个元素是< =正在搜索的值。

但电流输出是

值值2: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); 
    } 
} 
+0

我不明白你的逻辑。你正在寻找一个地方应该将一个给定的值插入到一个有序的'ArrayList'中以保持它的排序吗? –

+0

另一种方法是从列表中间开始搜索,并检查变量是否高于或低于数组中的值,如果低于此值,则从这一点向后搜索,如果搜索结果较高,则向前搜索。 –

+0

所以你被要求实现一些听起来几乎像二分搜索的东西... – vanza

回答

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); 
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; 
+0

这不会处理的情况下值 bcorso

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

最后,这段代码假设数组并不保证被排序,并且只需要搜索一次。否则,binary search可能更高性能。在这个问题上的其他答案已经显示如何实现这一点。

+0

@fracis是你理解正确 – BeyondProgrammer

+0

@ user2822351:如果你的'ArrayList'未排序,那么直接搜索可能是你唯一的选择。 –

+0

如何初始化'value2'?如果'value'大于列表中的所有**元素,会发生什么? –

0

一旦你对列表进行排序,binarySearchCollections将这样的伎俩:

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

如果index非负,这个数字在列表中被发现,并index是位置。如果是负数,则不会找到,但index表示它在列表中的位置。

并与O(log n)运行时间进行搜索。

+0

如果您只打算搜索一次列表,实际运行时间为'O(n log n)',因为您必须先排序。 – Aurand

+0

我只是指搜索,因为这是OP所关注的。为清晰起见进行编辑。 – Vidya

0

按照OP的评论:

  1. 名单没有排序
  2. 如果值<分钟返回分钟
  3. 如果值>最大回报最高
  4. 如果分< =值< =最大回报最近的值< =值

    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),nearest = max。

+0

我已经添加了3个列表示例 – BeyondProgrammer

+0

在您的示例中,您尝试传达的确切规则不明确。我认为你的意思是最后一个例子显示数字立即<26,这是10.在这种情况下,这段代码会给你正确的答案。 – bcorso