Я думал о том, чтобы поместить первые значения, указанные вверху, как константы, а остальные данные в список 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
0
ChalupaBatmac 12 Ноя 2019 в 00:21
1
Я предполагаю, что вы используете класс java.util.Scanner для чтения чисел? Используйте не nextInt, а nextDouble.
 – 
smac89
12 Ноя 2019 в 00:27
1
Также, если вы спрашиваете о разборе файла, вы должны показать некоторый код, потому что есть много способов разобрать файл.
 – 
smac89
12 Ноя 2019 в 00:30
1
Или, в более общем случае, вызовите Double.parseDouble().
 – 
markspace
12 Ноя 2019 в 00:31
Да. Будут ли у этого проблемы с целыми числами? Я предполагал, что нет, так как память, необходимая для целого числа, меньше, чем для двойного, так что нет, потери в точности нет. Однако в файле есть как целые, так и двойные числа, поймает ли nextDouble оба?
 – 
ChalupaBatmac
12 Ноя 2019 в 00:31

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, если это число находится в обычном научном формате с десятичным показателем степени.

1
Jannik 12 Ноя 2019 в 01:06
Пара вопросов: 1) Для чего нужен locale.setDefault(locale.ROOT)? 2) Как бы вы поступили с такой записью, как: «1.8400e-016»? 3) Как вы разбираете thisnode перед parnode? мне кажется, вы просто ловите один и тот же int сразу.
 – 
ChalupaBatmac
12 Ноя 2019 в 00:50
Я обновил ответ на первые два вопроса. Что касается последнего: мне кажется, это нормально. Посмотрите на первые две строки вывода. Числа разделены на два массива или я что-то упустил?
 – 
Jannik
12 Ноя 2019 в 01:07