Java搜索数组中存在的元素

时间:2019-01-13 22:59:53

标签: java arrays

对于Java和oop来说是全新的。所以要善良。

我有一个包含10个整数的文本文件 searchkeysArray.txt 。该程序将创建一个名为 keysArr 的数组。我还有另一个500个随机整数的文本文件 array1.txt 。该程序将创建另一个名为 array1 的数组。

我想使用我创建的linearSearch方法在 array1 中搜索 keysArr 的元素并输出其存在的索引。

public static int linearSearch(int arr[], int x)
{  
    int size = arr.length;
    for(int i = 0; i < size; i++)
    {
        if(arr[i] == x)
            return i;
    }

    return -1;
}

readFile方法

public static int[] readFile(String file)
{
   try {
            File f = new File(file);
            Scanner s = new Scanner(f);

            int ctr = 0;

            while (s.hasNextInt())
            {
                ctr++;
                s.nextInt();
            }
            int[] arr = new int[ctr];  //create array of that size

            Scanner scanner2 = new Scanner(f);

            for (int i = 0; i < arr.length; i++)
                    arr[i] = scanner2.nextInt();

            return arr;
        }
            catch(Exception e)
             {
                 return null;
             }

程序。

 public static void main(String[] args) 
{
   int[] keysArr = readFile("searchkeysArray");
   int[] array1 = readFile("array17"); 
  int key = 34;

  int result = linearSearch(array1, key);
        if (result != -1)
        System.out.print("The element " +key+" is present in the array, at index " + result + " ");
        else
            System.out.print("The element " +key+" is not present in the array ");
}

它会输出

The element 34 is present in the array, at index 359

这很有意义。我已经手动测试了数字,并且(显然)一切正常。但是我不太了解如何使用keysArr作为密钥,而不是 int x =某个数字

想要输出类似

The element [keysArr[0]] is present in the array, at index 359
The element [keysArr[1]] is present in the array, at index 547
  ...
The element [keysArr[4]] is not present in the array 

,依此类推。 现在keysArr只是一个由10个整数组成的数组,但是我最终将使用数百个。

2 个答案:

答案 0 :(得分:2)

您希望不使用特定的硬编码键(例如int key = 34),而是遍历键数组keysArr。您可以使用以下代码来实现这一点:

for (int key : keysArr) {
    int result = linearSearch(array1, key);
    if (result != -1)
        System.out.print("The element " +key+" is present in the array, at index " + result + " ");
    else
        System.out.print("The element " +key+" is not present in the array ");
}

答案 1 :(得分:0)

您的线性算法值得O(n ^ 2),如果您要增加整数的数量,这是非常糟糕的。

我建议您将字典元素加载到hash-map的Value-> Index中,并遍历values数组,以查找hashMap中的位置。这将给您O(2n)-复杂度将是线性的。但是,您将需要2n的内存。但是对于您而言,这是微不足道的。

public static void main(String[] args) {
    printResults(new int[]{1, 2, 3, 4}, new int[]{3, 4, 7, 9});
}

public static void printResults(int dictionary[], int valuesToSearch[]){
    Map<Integer, Integer> positionsMap = new HashMap<>();
    IntStream.range(0, dictionary.length).forEach(index -> positionsMap.put(dictionary[index], index));
    Arrays.stream(valuesToSearch).mapToObj(value -> positionsMap.containsKey(value) ?
            format("Value %s is present in the array at index %s", value, positionsMap.get(value)) : format("Value %s is not present in the array", value)
    ).forEach(System.out::println);
}