对于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个整数组成的数组,但是我最终将使用数百个。
答案 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);
}