在一维数组中搜索

时间:2011-08-23 00:09:56

标签: java arrays

我设法在数组中搜索,但是如何显示数组中搜索的值的位置以获取下面的代码?

import javax.swing.*;
import java.util.Arrays;

public class Listahan {

    public static void main(String[] args){
        int list1[] = {1,3,2,5,7,8,5,6,9,4};
        int list2[] = {2,1,4,3,2,1,4,2,0,2};
        int list3[] = new int[10];
        int a;

        System.out.print("List1: ");
        for(a=0; a<10; a++){
            System.out.print(list1[a]+" ");
        }
        System.out.print("\nList2: ");
        for(a=0; a<10; a++){
            System.out.print(list2[a]+" ");
        }
        System.out.print("\nList3: ");
        for(a=0; a<10; a++){
            list3[a]=list1[a]+list2[a];
            System.out.print(list3[a]+" ");
        }

        int searchValue = Integer.parseInt(JOptionPane.showInputDialog("Input a value to search in List3: "));
        int Result = Arrays.binarySearch(list3,searchValue);

        if(Result!=-3){
            System.out.println("\n\nThe value "+searchValue+" is in List3!");
            System.out.println("There are "+Result+" of it in List3.");

        }else{
            System.out.println("\n"+searchValue+" cannot be found in List3.");
        }
    }


}

例如,如果我搜索了9,则输出为:

值9在List3中! List3中有4个 位于:list3 [4],list3 [5],list3 [6],list3 [8]

4 个答案:

答案 0 :(得分:6)

代码中有一些事情需要指出。

  1. binary search仅在排序列表上
  2. Arrays.binarySearch方法的返回值是一个位置,而不是出现位置。
  3. 二元搜索仅在排序列表中

    在上面的代码中,列表list1list2list3都是未排序的列表。二进制搜索算法要求在应用搜索算法之前对上执行搜索的列表进行排序。

    Arrays.binarySearch方法的Javadoc中记录了此要求:

      

    使用指定的值搜索指定的字节数组   二进制搜索算法。 必须对数组进行排序(如   在进行此调用之前,sort(int [])方法。如果没有排序,   结果未定义。如果数组包含多个元素   如果具有指定的值,则无法保证将使用哪一个   找到。

    [强调补充]

    Arrays.binarySearch方法的返回值是一个位置,而不是出现次数

    再一次,您对binarySearch方法的期望存在问题 的工作原理。

    int Result = Arrays.binarySearch(list3,searchValue);
    
    // .. other code ..
    
    System.out.println("There are "+Result+" of it in List3.");
    

    以上代码行,binarySearch方法的返回值,即找到指定元素的位置,正在被使用,好像它的数量是在列表中出现该元素。

    此外,使用if变量的Return语句可能因巧合编程而起作用:

        int Result = Arrays.binarySearch(list3,searchValue);
    
        if(Result!=-3){  // What does the -3 signify??
           // do something
        }else{
           // do something
        }
    

    根据Arrays.binarySearch javadoc,如果在列表中找到指定的元素,该方法将返回非零值。它返回一个不是-3的值并不表示任何特定的返回状态 - 因此,这段代码可能只是由于列表包含某种特定值的值而运行,因此代码将尽快中断list1list2完全改变了。

    您需要查看Arrays.binarySearch方法的Javadoc,以了解该方法将为您返回的确切内容。

    附加说明

    作为补充说明,如果您希望显示指定元素出现的次数和位置,您可能最好只在列表上执行for循环,并检查每个元素是否有效互相equals

    这里有一些伪代码:

    for each element in list:
      is the element the element we're looking for?
        if yes, then increment the occurrences counter
        if yes, then print out the current position
    

    关于编码风格的最终说明

    最后,作为最后一点,编码风格可以稍微改进一些,使事情更易于阅读并符合Java编码标准。

    在标点符号周围添加一些空格

        int list1[] = {1,3,2,5,7,8,5,6,9,4};
    
        for(a=0; a<10; a++){
            System.out.print(list1[a]+" ");
        }
    

    如果我们用英文写作,我们会在标点后添加空格以便于阅读。编码时我们应该这样做,以使代码更容易阅读。在逗号和运算符之后添加空格应该会让事情变得更容易:

        int list1[] = {1, 3, 2, 5, 7, 8, 5, 6, 9, 4};
    
        for(a = 0; a < 10; a++) {
            System.out.print(list1[a] + " ");
        }
    

    其次,变量名称应以小写字母开头,因此Return变量应该类似returnValue或更好position,因为Arrays.binarySearch方法返回找到元素的位置。

    有关详细信息,请查看Code Conventions for the Java Programming Language

答案 1 :(得分:2)

注意:Arrays.binarySearch方法假定您的数组已排序......它不是。

答案 2 :(得分:0)

由于这是家庭作业,您需要做一些研究才能找到完整的解决方案。阅读Arrays.binarySearch()方法的返回值。另外一定要注意文档中描述的输入参数:

Java Arrays reference

答案 3 :(得分:0)

System.out.println("There are "+**Result**+" of it in List3.");

您的result变量不是数组中的数字9,而是插入点。

Arrays.binraySearch()会返回插入点 - 巧合的是你要找的

http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#binarySearch(int[], int)

  

插入点定义为密钥所在的点   插入数组

在使用二进制搜索之前,您的数组也必须进行排序