Java 如何将文件中的元素总数放入数组中?
我需要制作一个程序,用一个方法读取一个文件。该文件是“data.txt”类型,将有一个数字列表(双数据类型),每行有一个数字。 例: 然后我需要将其放入一个数组(不是2D数组)并将其返回到main方法。 我使用了Java 如何将文件中的元素总数放入数组中?,java,arrays,Java,Arrays,我需要制作一个程序,用一个方法读取一个文件。该文件是“data.txt”类型,将有一个数字列表(双数据类型),每行有一个数字。 例: 然后我需要将其放入一个数组(不是2D数组)并将其返回到main方法。 我使用了filename.length(),但它使数组大小超出了应有的大小,并且我得到了一个数组越界错误。 我可以在while循环中初始化数组,但它一直说我需要先声明数组的大小,我不知道如何做。因此,我尝试使用while循环来获取行数,然后使用另一个循环来输入元素,但它不允许在不初始化数组的情况
filename.length()
,但它使数组大小超出了应有的大小,并且我得到了一个数组越界错误。
我可以在while循环中初始化数组,但它一直说我需要先声明数组的大小,我不知道如何做。因此,我尝试使用while循环来获取行数,然后使用另一个循环来输入元素,但它不允许在不初始化数组的情况下将数组返回到main方法。以下是我目前掌握的情况:
java.io.File file = new java.io.File(file);
int arraySize = (int)file.length();
int size = 0;
int i = 0;
try{
Scanner input = new Scanner(file);
while(input.hasNextLine()){
size++;
}
double [] array;
array1 = new double [size];
while(input.hasNext()){
array[i] = input.nextDouble();
i++;
}
有什么建议吗?我真的被这件事缠住了。谢谢。两种可能的解决方案: a) 使用按需增长的集合,而不是使用固定数组(例如ArrayList)。您还可以在以后将其再次转换为数组
b) 在计算行数后,关闭扫描仪并再次打开文件。假设
文件名
变量是文件名的字符串,则文件名。长度
仅给出名称中的总字符数。如果调用了文件
对象文件名
,则文件名.length()
返回文件长度的long
,以字节为单位,而不是其中的行数
要获得文件中的行数,您可以参考此问题以获得许多可能的答案:
但更可能的情况是,您希望使用可扩展的集合
而不是固定长度的数组
,因为您不需要在开始使用之前计算和读取整个文件。类似于ArrayList
的东西可能是理想的。但这取决于您的用例。之后,您始终可以将
阵列列表
转换回阵列
:
String[] lines = lineList.toArray(new String[lineList.size()]);
我建议使用ArrayList。这样,在创建阵列时就不必知道大小。正如其他人所说,在向ArrayList添加值之后,可以转换为数组 假设您的data.txt文件具有不带空格的逐行双精度。您可以使用以下代码:
ArrayList <Double> doubleArray = new ArrayList<Double>();
Scanner fileScan = null;
try {
fileScan = new Scanner(new File("/path/to/file"));
while (fileScan.hasNextDouble()){
doubleArray.add(fileScan.nextDouble());
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ArrayList doubleArray=new ArrayList();
Scanner fileScan=null;
试一试{
fileScan=newscanner(新文件(“/path/to/File”);
while(fileScan.hasNextDouble()){
添加(fileScan.nextDouble());
}
}catch(filenotfounde异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
现在的问题是,您没有重新定义扫描仪
,因此在确定大小后,扫描仪
位于文件的末尾,因此没有更多要读取的双精度扫描仪
此外,在确定大小时,您需要实际读取每个循环中的行,以便跳到新行,否则我认为您将有一个无限循环。如果你从来没有读过一行,它总是有更多
尝试以下方法(经过测试,效果良好):
或者您可以只使用没有定义大小的(您可以
。向其中添加元素,这样您就不需要事先知道大小来填充它)。然后只要将ArrayList
转换为常规数组后缀即可
试试这个:
java.io.File file = new java.io.File("C:\\Users\\Mike\\Desktop\\data.txt");
try {
Scanner input = new Scanner(file);
ArrayList<Double> list = new ArrayList<Double>(); // define empty ArrayList
while(input.hasNextLine()) {
list.add(input.nextDouble()); // have to change the lines
}
// convert ArrayList to array
// (although you don't need to do this if you're fine with an ArrayList)
double[] array = new double[list.size()];
for (int i = 0; i < list.size(); i++) {
array[i] = list.get(i);
}
// print out the array
for (double d : array) {
System.out.println(d);
}
} catch (Exception e) {
e.printStackTrace();
}
java.io.File File=new java.io.File(“C:\\Users\\Mike\\Desktop\\data.txt”);
试一试{
扫描仪输入=新扫描仪(文件);
ArrayList=新建ArrayList();//定义空ArrayList
while(input.hasNextLine()){
list.add(input.nextDouble());//必须更改行
}
//将ArrayList转换为array
//(虽然如果您对ArrayList没有问题,则不需要执行此操作)
double[]数组=新的double[list.size()];
对于(int i=0;i
使用下面的代码
逐行读取文本文件,并将每行元素解析为双精度
将双解析值添加到arraylist
将arraylist转换为array
String fileName=null;
File file = null;
try {
fileName="path/filename.txt";
file = new File(fileName);
} catch (Exception e) {
System.out.println(e.getMessage());
// TODO: handle exception
}
List<Double> elements = new ArrayList<>();
try{
Scanner input = new Scanner(file);
while(input.hasNextLine()){
elements.add(Double.parseDouble(input.nextLine()));
}
double[] ret = new double[elements.size()];
for(int index = 0;index < ret.length;index++)
ret[index] = elements.get(index);
System.out.println(ret);
System.out.println("end");
}
catch(Exception e){
}
字符串文件名=null;
File=null;
试一试{
fileName=“path/fileName.txt”;
文件=新文件(文件名);
}捕获(例外e){
System.out.println(e.getMessage());
//TODO:处理异常
}
列表元素=新的ArrayList();
试一试{
扫描仪输入=新扫描仪(文件);
while(input.hasNextLine()){
add(Double.parseDouble(input.nextLine());
}
double[]ret=新的double[elements.size()];
对于(int index=0;index
使用ArrayList而不是array,这样您就不需要提前知道大小。如果您仍然需要返回数组,请在返回之前将ArrayList转换为数组。请让我知道我的答案是否适合您。我以前没有使用数组列表,很遗憾,我需要使用普通数组。非常感谢!你帮了很多忙。它确实起作用了,但我必须改变一些东西来防止.hasNextLine()无限运行。@user3552956没问题。很乐意帮忙。
java.io.File file = new java.io.File("C:\\Users\\Mike\\Desktop\\data.txt");
try {
Scanner input = new Scanner(file);
ArrayList<Double> list = new ArrayList<Double>(); // define empty ArrayList
while(input.hasNextLine()) {
list.add(input.nextDouble()); // have to change the lines
}
// convert ArrayList to array
// (although you don't need to do this if you're fine with an ArrayList)
double[] array = new double[list.size()];
for (int i = 0; i < list.size(); i++) {
array[i] = list.get(i);
}
// print out the array
for (double d : array) {
System.out.println(d);
}
} catch (Exception e) {
e.printStackTrace();
}
String fileName=null;
File file = null;
try {
fileName="path/filename.txt";
file = new File(fileName);
} catch (Exception e) {
System.out.println(e.getMessage());
// TODO: handle exception
}
List<Double> elements = new ArrayList<>();
try{
Scanner input = new Scanner(file);
while(input.hasNextLine()){
elements.add(Double.parseDouble(input.nextLine()));
}
double[] ret = new double[elements.size()];
for(int index = 0;index < ret.length;index++)
ret[index] = elements.get(index);
System.out.println(ret);
System.out.println("end");
}
catch(Exception e){
}