//package alg;
import java.io.*;
//import java.io.File;
//import java.io.FileNotFoundException;
//import java.io.InvalidCommandException;
//import java.io.NumberFormatException;
import java.util.Arrays;
//import java.util.ArrayList;
//import java.util.List;
import java.util.Scanner;
//import javax.sound.sampled.Line;
public class FindOut
{
public static void Find(int [] Ray, int min , int max)
{
if(min > max)
{
return;
}
if(min == max)
{
System.out.println(Ray[min]);
return;
}
int med = (min + max)/2;
if(med % 2 == 0)
{
if(Ray[med] == Ray[med + 1])
Find(Ray, med + 2, max);
else
Find(Ray, min, med);
}
else //if(med % 2 == 1)
//{
if(Ray[med] == Ray[med-1])
Find(Ray, med + 1 , max);
else
Find(Ray, min, med - 1);
// }
}
public static void main(String [] args) throws FileNotFoundException
{
@SuppressWarnings("resource")
File file = new File(args [0]);
Scanner scanner = new Scanner(file);
try
{
int[] Ray = new int [5];
while(scanner.hasNext())
{
String num = scanner.next();
Ray = Arrays.stream(num.split(",")).mapToInt(Integer::parseInt).toArray();
Find(Ray,0, Ray.length-1);
}
// File inputFile = new File(num);
}
catch(NumberFormatException ex)
{
}
}
}
我需要的是通过命令行输入文件,它将读取内部的整数,将它们放入我通过函数发送的数组中,找到只出现一次的元素,如
3,3,48,48,65,95,95
应输出
65
但它的作用是
3 3 48 48 65 95 95
我知道它不是我用硬编码测试过的功能,并且一步一步地在逻辑上运行,所以任何人都可以解释这个问题吗?
答案 0 :(得分:0)
文件的读取方式有问题。似乎代码期望一行包含整个数字列表。但是,Scanner
使用空格作为默认分隔符。 Find
最终会为文件中的每个数字调用一次。
要修复它,可以像这样指定分隔符:
Scanner scanner = new Scanner(file).useDelimiter(",");
这意味着你不需要做mapToInt
事。相反,我建议您使用Collections
中的容器,例如ArrayList
,并在转换为整数后将数字附加到该容器。
public static void main(String[] args) throws FileNotFoundException {
@SuppressWarnings("resource")
File file = new File(args [0]);
Scanner scanner = new Scanner(file).useDelimiter(",");
try {
ArrayList<Integer> Ray = new ArrayList<>();
while (scanner.hasNext()) {
String num = scanner.next().trim();
Ray.add(Integer.parseInt(num));
}
scanner.close();
int[] arr = Ray.stream().mapToInt(i -> i).toArray();
Find(arr, 0, arr.length - 1);
} catch (NumberFormatException ex) {
}
}
使用ArrayList
允许它根据需要进行扩展,这与具有固定大小的数组不同。这很方便,因为这意味着您不必提前知道文件中的整数数量。
为了保持与Find
功能的兼容性,我将ArrayList
转换回普通数组。不过,我建议您更新您的功能以接受ArrayList
。