#java #arrays #input #addition
#java #массивы #ввод #сложение
Вопрос:
Как узнать, сколько токенов в строке в приведенной ниже программе, а затем мне нужно добавить два целых массива, используя Java, поскольку я больше знаком с php, для меня это немного сложно. Также я получаю входные данные из текстового файла. Следовательно, вот как у меня пока работает моя программа.
Входной файл будет содержать несколько строк, подобных этой 3736 17234 29823 84478 123745 2371 34237 823712
import java.io.*;
import java.util.*;
public class Sum {
//must use a constant for the length of the array
static int[] total= new int[25];
static int[] val = new int[25];
static int line= 0;
static int word =0;
public static void main(String[] args) throws FileNotFoundException {
Scanner input = new Scanner(new File("Input.txt"));
// System.out.println("0");
processFile(input);
}
public static void processFile(Scanner input) {
//in this method you need to read your input file
//. read one line at a time and call the method processLine to
while (input.hasNextLine())
{
line ;
String line = input.nextLine();
Scanner lineScan = new Scanner(line);
//System.out.println("1");
processLine(input);
//System.out.println(line);
}
}
public static void processLine(Scanner data) {
//in this method you read tokens from line that has been passed to
// this methd as the parameter. method transfer needs to be called to
// transfer each token into an array of length DIGITS. Note that in a
// line you might only have one token
while(data.hasNext())
{
String x = data.next();
//System.out.println("2");
transfer(x,val);
}
}
public static void transfer(String data, int[] digits) {
//This method transfer the string into array of integers value.
int len = data.length();
int n=24;
for(int i=0;i<=n;i )
digits[i]=0;
//System.out.println("3");
while(len>0)
{
// System.out.println(data.charAt(len-1));
char z=data.charAt(len-1);
int d = Character.digit (z, 10);
digits[n]=d ;
len=len-1;
n=n-1;
}
for(int i=0;i<=n;i )
digits[i]=0;
for(int i=0;i<25;i )
{
//System.out.println(digits[i]);
}
System.out.println("n");
add(digits);
}
public static void add(int[] digits) {
word ;
if (word>1)
{
for(int i=0; i<= 4; i )
{
total= total[i] digits[i];
}
}
if(word==0)
total=digits;
}
public static void print(int[] digits) {
//For printing
}
}
Комментарии:
1. Ваш
add()
метод принимает только 1 аргумент, вы имели в виду, что он принимает 2 аргумента (2 массива для добавления)?2. Я не могу заставить его принимать 2 аргумента, поскольку в любой момент доступен только 1 токен. Вы можете подсказать, как это может принимать 2 аргумента. Является ли хранение хорошим способом в этом случае?
3. Пожалуйста, смотрите мой ответ ниже! Почему вы хотите хранить целые числа в виде строк?
4. Входные данные иногда настолько огромны, что их невозможно сохранить в целых числах.
5. Используйте long вместо int, если это так.
Ответ №1:
Используйте цикл for, чтобы просмотреть 2 массива и добавить каждый элемент.
Краткий пример кода ниже:
private int[] sumTwoArrays(int [] a, int [] b){
if(a.length!=b.length){
throw new IllegalArgumentException("Arrays are not of same length!");
}
int[] sum = new int[a.length];
for(int i=0;i<a.length;i ){
sum[i] = a[i] b[i];
}
return sum;
}
ОБНОВЛЕНИЕ: После комментариев ниже я добавил другой метод добавления только элементов в один массив.
private void readFile(){
long sum=0;
//do your FILE I/O here
//for each line you read into an array called input[] you call this method
sum = sumArray(input);
System.out.println(sum);
}
private long sumArray(long [] a){
long sum=0;
for(int i=0;i<a.length;i ){
sum = a[i];
}
return sum;
}
Комментарии:
1. Массивы будут иметь максимальную длину 25. Цикл for определенно помог и работает, но он обновляет его последними двумя значениями массива. Я ищу способ узнать, сколько токенов в строке, чтобы я мог выполнить правильное сложение. Я также добавлю некоторые входные данные.
2. Я понятия не имею, что вы подразумеваете под последними 2 значениями обновления. Вам нужно общее количество всех элементов в 2 массивах или сумма соответствующих индексов?
3. Как вы видите на входе, в текстовом файле есть несколько таких строк. Мне нужна сумма значений в каждой строке. Итак, если на входе 1 2 3, на выходе 1 2 3 = 6
4. Хорошо, итак, зачем вам для этого нужны массивы? Просто сохраняйте счетчик сумм и добавляйте числа по мере их чтения из файла.
5. Спасибо за ваши ответы. Это требование в данном случае. Ничего не мог с собой поделать. 🙂
Ответ №2:
Вы усложнили это намного больше, чем необходимо. Для начала вы можете удалить ссылки на несколько функций, класс scanner действительно может разобрать ваш файл на целые числа и может читать несколько строк — так что вам не нужен новый сканер для каждой строки.
Я думаю, вы можете просто иметь по одному сканеру на файл, а затем постоянно использовать функцию Scanner.nextInt() для поиска следующего целого значения в этом файле.
Теперь, в зависимости от вашего определения add, вы могли бы сделать две вещи.
- Если вы пытаетесь добавить соответствующие элементы каждого массива, чтобы получить третий массив, где x [i] = y [i] z [i], тогда вам просто нужен цикл for с предыдущей инструкцией в нем. Не забудьте, конечно, подставить настоящие имена переменных.
- Если вы пытаетесь сложить все целые числа в обоих массивах, чтобы получить одно целое число (или long), вы могли бы использовать два цикла for, один за другим, и постоянно добавлять текущий элемент текущего массива в переменную.