Java 如何使用扫描仪插入arraylist?

Java 如何使用扫描仪插入arraylist?,java,insert,arraylist,mergesort,insertion-sort,Java,Insert,Arraylist,Mergesort,Insertion Sort,我在尝试找出如何使用扫描程序将整数插入ArrayList时遇到了一些问题。我对java不是很在行(实际上甚至不是很在行),但我只是想弄明白一些事情,任何帮助都会很好 package mySort; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Scanner; public class MergeInsert

我在尝试找出如何使用扫描程序将整数插入ArrayList时遇到了一些问题。我对java不是很在行(实际上甚至不是很在行),但我只是想弄明白一些事情,任何帮助都会很好

package mySort;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;



public class MergeInsert {
private int limit = 100;
//private int size = 0;
private ArrayList<Integer> ArrayToSort;

public MergeInsert(int x) {
    ArrayToSort = new ArrayList<Integer>(x);
    }

public MergeInsert(Scanner integerScan){
    int j = 0;
    while(integerScan.hasNextInt()){
        this.insert(integerScan.hasNextInt());
        if (j % 10000 == 0){
            long time = System.nanoTime();
            System.out.println(j + "," + time);
        }
    }
}

public void insert(int x){
    for(int i=0; i<ArrayToSort.size(); i++){
        ArrayToSort(size++) = x;
    }
}


//  public MergeInsert(int v){
//      int val = v;
//  }

//    public void insertFile(){
//      try {
//          Scanner integerScan = new Scanner(new FileInputStream(""));
//          while(integerScan.hasNextInt()){
//              new MergeInsert(integerScan.nextInt());
//          }
//      }
//       catch (FileNotFoundException e) {
//          // TODO Auto-generated catch block
//          e.printStackTrace();
//      }
//    }


public void sort(){

}

public void mergeSort(ArrayList<Integer> in, int low,int high){
    int n = in.size();
    int mid = (high+low)/2;
    if (n<2){  //already sorted
        return;
    }
    if ((high - low) < limit){
        insertionSort(in);
    }
    ArrayList<Integer> in1 = new ArrayList<Integer>(); //helper
    ArrayList<Integer> in2 = new ArrayList<Integer>(); //helper
    int i=0;

    while (i < n/2){ //moves the first half to the helper
        in1.add(in.remove(0));
        i++;
    }
    while (!in.isEmpty()) //moves the second half to the helper
        in2.add(in.remove(0));
    mergeSort(in1, low, mid); //breaks it down some more like mergesort should
    mergeSort(in2, mid+1, high); //does it again
    merge(in1,in2,in); //trying to build it up again
    }

public void merge(ArrayList<Integer> in, ArrayList<Integer> in1, ArrayList<Integer> in2){
    while (!in1.isEmpty() || !in2.isEmpty()) //as long as both helpers still have elements
        if ((in1.get(0).compareTo(in2.get(0)) <= 0)) //comparison to rebuild
            in.add(in1.remove(0)); //building it back up
        else
            in.add(in2.remove(0)); //still building
    while(!in1.isEmpty()) //as long as the first helper isn't empty keep building
        in.add(in1.remove(0));
    while(!in2.isEmpty()) //as long as the second helper isn't empty keep building
        in.add(in2.remove(0));
}

public ArrayList<Integer> insertionSort(ArrayList<Integer> in){
    int index = 1;
    while (index<in.size()){
        insertSorted((int)(in.get(index)),in,index);
        index = index +1;
    }
    return in;
}

public ArrayList<Integer> insertSorted(Integer s, ArrayList<Integer> in, int index){
    int loc = index-1;
    while((loc>=0) || s.compareTo(in.get(loc)) <= 0){
        in.set(loc + 1, in.get(loc));
        loc = loc -1;
    }
    in.set(loc+1, s);
    return in;
    }


/**
 * @param args
 * @throws FileNotFoundException 
 */
public static void main(String[] args) throws FileNotFoundException {
    Scanner integerScan = new Scanner(new FileInputStream("src/myRandomNumbers.txt"));
    MergeInsert myObject = new MergeInsert(integerScan);
    myObject.sort();

}

}
包mySort;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.util.ArrayList;
导入java.util.Scanner;
公共类合并插入{
私有整数限制=100;
//私有整数大小=0;
私有ArrayList ArrayToSort;
公共合并插入(int x){
ArrayToSort=新的ArrayList(x);
}
公共合并插入(扫描整数扫描){
int j=0;
while(integerScan.hasNextInt()){
this.insert(integerScan.hasNextInt());
如果(j%10000==0){
长时间=System.nanoTime();
System.out.println(j+,“+时间);
}
}
}
公共空白插入(int x){
对于(int i=0;i用于将对象插入列表

另外,按照现在的代码结构,当您尝试调用
add
时,您将得到一个
NullPointerException
,因为您调用的构造函数从未初始化列表

鉴于代码的质量,我强烈建议您阅读

原因是…即使你走了

ArrayToSort = new ArrayList<Integer>(100000);
ArrayToSort=新的ArrayList(100000);

它的大小仍然是0。它的容量只有100000。

对不起,我忘了在那里添加了大小参考。我只是想看看这是否有帮助,然后才发布,显然没有。如果你不提供大小,它只会
新建ArrayList(10)
相反。如果需要,您可以覆盖默认值10。ArrayList是否在运行时根据需要展开?例如,如果我正在读取1000个元素,它将展开以容纳它们,如果我从另一个文件中读取了100万个元素,它也应该在不修改代码的情况下处理。或者我的理解是错误的?您的理解是错误的吗正确。但是,如果您知道您将获得至少一定数量的记录,为什么不为自己保存一些不需要的扩展?默认情况下,它是10,因此它将扩展为20、40、80、160、320、640、1280、2560、5120、10240、20480、40960、81920、163840、327680和655360。因此,这是您根本不需要的16个扩展如果你知道你将获得1000000条记录,那就去做。如果你不预先分配,它仍然可以正常工作,只是会稍微慢一点。好的,知道了,谢谢。我不知道它一直都是两倍大小。如果我覆盖了它,肯定会帮助事情运行得快一点。因为我正在努力让它在第一时间运行得更快t place那么这样做才有意义。顺便说一句,使用插入排序而不是合并排序的阈值非常高。在JDK中,它是7。它的值为100.:-OI只是暂时将它用作占位符。我打算在不同大小的列表上运行它,看看什么对不同大小的列表最合适分析和调整常量是最好的方法!:-)
ArrayToSort = new ArrayList<Integer>(100000);