我有一个名为" animals.txt"的输入文件:
sheep 10.5 12.3 4
horse 8.4 11.2 7
cow 13.7 7.2 10
duck 23.2 2.5 23
pig 12.4 4.6 12
简单地说一下,我想知道如何将4列数据存储到输入文件中的4个独立的1维数组中。
输出应该像这样......
[sheep, horse, cow, duck, pig]
[10.5, 8.4, 13.7, 23.2, 12.4]
[12.3, 11.2, 7.2, 2.5, 4.6]
[4, 7, 10, 23, 12]
到目前为止,我已经想出了如何将所有数据存储到一个大型数组中,但我需要知道如何将其分解并将每个列存储到自己的数组中。
我的代码:
public static void main(String[] args) throws FileNotFoundException {
String[] animal = new String[5];
int index = 0;
File file = new File("animals.txt");
Scanner input = new Scanner(file);
while (input.hasNextLine() && index < animal.length) {
animal[index] = input.nextLine();
index++;
}
答案 0 :(得分:1)
您可以使用数组数组来存储您需要的内容,例如:
String[][] animal = new String[5][];
然后,当您读取文件时,存储所有值的数组,如下所示:
while (input.hasNextLine() && index < animal.length) {
animal[index] = input.nextLine().split(" "); //split returns an array
index++;
}
然后,当你想输出时,只需遍历数组数组:
for (String[] a : animal)
{
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + ", ");
System.out.println("");
}
答案 1 :(得分:1)
以下是执行此操作的代码 - 您可以将其剪切并粘贴到像eclipse这样的IDE中的Java项目中并运行它或将其放在file.java中并在命令行上编译并运行它。下一步是使其完全通用以获取任何输入,包括具有可变数量的列而没有预定最大值的行,并且不读取输入文件两次或将其作为数组或其他对象存储。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class BuildTableWithArrays {
private static final String separator = "\\s+"; // regex for parsing lines
private static final int rowWidth = 4;
public static void main(String[] args) {
Map<Integer, ArrayList<String>> columns = buildMapWithColumnArrayLists("animals.txt");
printMap(columns); // for demo
// if you want actual arrays
Map<Integer, String[]> colArrays = buildMapWithColumnArrays(columns);
}
public static Map<Integer, ArrayList<String>> buildMapWithColumnArrayLists(
String fileName) {
ArrayList<String> col0 = new ArrayList<String>();
ArrayList<String> col1 = new ArrayList<String>();
ArrayList<String> col2 = new ArrayList<String>();
ArrayList<String> col3 = new ArrayList<String>();
Map<Integer, ArrayList<String>> columns = new HashMap<Integer, ArrayList<String>>();
columns.put(0, col0);
columns.put(1, col1);
columns.put(2, col2);
columns.put(3, col3);
File file = new File(fileName);
try {
Scanner input = new Scanner(file);
while (input.hasNextLine()) {
String[] line = input.nextLine().trim().replaceAll(separator, " ")
.split(separator);
for (int i = 0; i < rowWidth; i++) {
if (line[i] == null) {
columns.get(Integer.valueOf(i)).add("null");
} else {
columns.get(Integer.valueOf(i)).add(line[i]);
}
}
}
input.close();
} catch (FileNotFoundException x) {
System.out.println(x.getMessage());
}
return columns;
}
public static void printMap(Map<Integer, ArrayList<String>> columns) {
for (int i = 0; i < rowWidth; i++) {
System.out.println("col" + i + " #elements = "
+ columns.get(Integer.valueOf(i)).size());
for (String s : columns.get(Integer.valueOf(i))) {
System.out.print(s + " ");
}
System.out.println("\n");
}
}
public static String[] convertArrayList2Array (ArrayList<String> arrayList) {
String[] array = new String[arrayList.size()];
array = arrayList.toArray(array);
return array;
}
public static Map<Integer, String[]> buildMapWithColumnArrays(Map<Integer, ArrayList<String>> columns) {
Map<Integer, String[]> cols = new HashMap<Integer, String[]>();
for (Map.Entry<Integer, ArrayList<String>> entry : columns.entrySet()) {
Integer key = entry.getKey();
ArrayList<String> value = entry.getValue();
String[] val = convertArrayList2Array(value);
cols.put(key,val);
}
return cols;
}
}
答案 2 :(得分:0)
如果输入文件的结构有保证,那么您可以使用扫描仪获取所需的数据。首先使用适当的类型声明所需的4个数组。
然后在你的while循环中使用:
input.next()
获取字符串
input.nextInt()
获取整数和
input.nextDouble()
获得双倍价值。当然,您可以将这些值分配给相应的数组。