二进制搜索找到不重复java的元素

时间:2017-09-30 04:13:34

标签: java binary-search

//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

我知道它不是我用硬编码测试过的功能,并且一步一步地在逻辑上运行,所以任何人都可以解释这个问题吗?

1 个答案:

答案 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