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