Я думал о том, чтобы поместить первые значения, указанные вверху, как константы, а остальные данные в список 2D-массивов. Однако что было бы более эффективным способом анализа этих данных в Java. Кроме того, как бы вы прочитали число вроде «1.8400e-016»? Кроме того, будет ли nextInt ловить только целое число в nextLine? Извините, я не знаком с вводом-выводом в Java.
Заранее спасибо,
Пример текстового файла:
Resistance per unit length (ohm/um): 0.0165
Capacitance per unit length (F/um): 1.8400e-016
Sink node capacitance (F): 2.500000e-016
Buffer output resistance (ohm): 0.01
Sinkcount: 267
Nodecount: 965
%thisnode parnode lcnode rcnode length(um) xloc(um) yloc(um)
1 534 -1 -1 405.080000 29322.000000 41420.000000
2 535 -1 -1 1635.360000 26208.000000 51579.000000
3 536 -1 -1 561.000000 35565.000000 61661.000000
4 537 -1 -1 223.150000 36852.000000 64281.000000
5 538 -1 -1 648.000000 33416.000000 62525.000000
6 539 -1 -1 1828.300000 36915.000000 67124.000000
7 270 -1 -1 126.700000 32275.000000 58078.000000
8 327 -1 -1 1358.200000 30591.000000 67258.000000
9 540 -1 -1 648.000000 33180.000000 61229.000000
1 ответ
Вы можете использовать класс java.util.Scanner
. Сканер имеет функцию hasNextDouble()
, чтобы проверить, является ли следующий токен в вашем файле двойным значением. Затем вы можете получить значение с помощью nextDouble()
. Сканер также позволяет легко считывать данные таблицы. Вы можете просто использовать цикл и читать целые числа с nextInt()
и текстовые ячейки с next()
.
Вот пример для вашей таблицы данных, а не текста впереди. Вам нужно будет установить достаточно большой размер массива или использовать что-то вроде List
.
Locale.setDefault(Locale.ROOT);
Scanner sc = new Scanner(System.in);
List<Double> l = new ArrayList<>();
int[] thisnode = new int[10];
int[] parnode = new int[10];
int[] lcnode = new int[10];
int[] rcnode = new int[10];
double[] Length = new double[10];
double[] xloc = new double[10];
double[] yloc = new double[10];
for (int i = 0; i < 10 && sc.hasNextInt(); i++) {
thisnode[i] = sc.nextInt();
parnode[i] = sc.nextInt();
lcnode[i] = sc.nextInt();
rcnode[i] = sc.nextInt();
Length[i] = sc.nextDouble();
xloc[i] = sc.nextDouble();
yloc[i] = sc.nextDouble();
}
System.out.println(Arrays.toString(thisnode));
System.out.println(Arrays.toString(parnode));
System.out.println(Arrays.toString(lcnode));
System.out.println(Arrays.toString(rcnode));
System.out.println(Arrays.toString(Length));
System.out.println(Arrays.toString(xloc));
System.out.println(Arrays.toString(yloc));
Который производит
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
[534, 535, 536, 537, 538, 539, 270, 327, 540, 0]
[-1, -1, -1, -1, -1, -1, -1, -1, -1, 0]
[-1, -1, -1, -1, -1, -1, -1, -1, -1, 0]
[405.08, 1635.36, 561.0, 223.15, 648.0, 1828.3, 126.7, 1358.2, 648.0, 0.0]
[29322.0, 26208.0, 35565.0, 36852.0, 33416.0, 36915.0, 32275.0, 30591.0, 33180.0, 0.0]
[41420.0, 51579.0, 61661.0, 64281.0, 62525.0, 67124.0, 58078.0, 67258.0, 61229.0, 0.0]
Строка, в которой я устанавливаю локаль, используется только для предотвращения использования сканером локализованного числового формата. Мой язык по умолчанию — немецкий, и поэтому сканер ожидает, что десятичные числа используют ,
для разделения десятичных разрядов вместо .
. Если это работает для вас, вам не нужно использовать эту строку.
Функция nextDouble()
отлично справится с вашим 1.8400e-016
, если это число находится в обычном научном формате с десятичным показателем степени.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.
java.util.Scanner
для чтения чисел? Используйте неnextInt
, аnextDouble
.Double.parseDouble()
.