Получение случайных слов при печати переменной массива в Java - PullRequest
3 голосов
/ 17 марта 2020

Я изучаю основы Java, и, кажется, есть наблюдение, я не могу разобраться.

Ниже приведен код, который должен печатать двоичный файл реализация числа base10. Там нет ошибок или предупреждений, но логические аномалии я ищу ответы.

import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.*;

public class Main
{
    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String args[]) {
        int n = scanner.nextInt();
        scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");

        int remainder, quotient, i=0;
        int[] binary=new int[n];

        /* Binary division -Extracting the 1's and 0's out of the base10 number and storing it in binary[] */
        while(n!=0){
            remainder=n%2;
            quotient=n/2;
            binary[i]=remainder;
            n=quotient;
            i++;
        }

        int k=i; // For storing the length of array till I want my bits to be reversed since all other bits are initialized to 0.

        /*Reversing the binary[] to get the coreect binary value.*/
        for(int j=0; j<=i; j++){
            int temp=binary[j];
            binary[j]=binary[i];
            binary[i]=temp;
            i--;
        }

        /*Printing out all the bits of binary number. */
        for(int l=1;l<=k;l++){
            System.out.print(binary[l]);
        }

        System.out.println(binary); /*Prints a garbage looking value: For ex- for 25 i get: [I@33909752 */
        scanner.close();
    }
}

Обеспокоенность по поводу моего кода:

1. Я не могу понять возможные рассуждения о том, почему я получаю случайное словосочетание, похожее на мусор, когда пытаюсь вывести переменную массива - binary. Это что-то ожидается? Если так, что это?

Например:

В моем коде, когда я предоставляю ввод 25, я получаю [I@33909752 при печати переменной binary. Я ожидал что-то вроде [1,1,0,0,1,0,....,0]

2. Я получаю дополнительно 0 перед моим двоичным значением, если я запускаю for-loop для печати binary из 0 вместо 1

Например:

for(int l=1;l<=k;l++)
{
  System.out.print(binary[l]);
}

Печать 11001 для 25, но если я начну l oop с 0, я получаю 011001. Я проверил все остальные места кода, поместив операторы SOPLn, и нигде индекс массива 0 не получает 0. Интересно, почему?

1 Ответ

5 голосов
/ 17 марта 2020
  1. Не импортируйте произвольные вещи, которые приходят вам в голову. Вы не используете ничего из пакетов java.io, java.math, java.security, java.text, java.util.concurrent или java.util.regex. Пока единственное, что требует импорта в вашем коде, это java.util.Scanner

  2. Вам не нужна такая конструкция, как scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?"). Если вы собираетесь читать другой токен, чего в вашем коде не происходит, сканер по умолчанию уже пропустит пробелы, включая разрывы строк. Также есть scanner.nextLine(), но вам здесь это не нужно.

  3. Не закрывайте System.in. Хотя Scanner, созданный вокруг ресурса, выделенного вами, должен быть закрыт, вы не несете ответственности за System.in.

  4. System.out.println(Object), который печатает результат вызова toString() на объект. Для классов, не предоставляющих реализацию, таких как массивы, метод, унаследованный от java.lang.Object, создает getClass().getName() + "@" + Integer.toHexString(hashCode()). Имя класса int[] массива - [I, поэтому вы видите [I@ плюс некоторое шестнадцатеричное число.

    Используйте взамен System.out.println(Arrays.toString(binary));. Но при этом будет напечатан весь массив, включая неиспользуемые элементы.

  5. Вместо изменения существующей переменной в al oop, создавая необходимость в новой переменной во внешней области видимости, вы следует ввести новую изменяемую временную переменную в l oop. Кроме того, вам необходимо ознакомиться со стандартной идиомой l oop, начать с нулевого индекса и исключить конечный индекс (используйте < вместо <=).

    Переменная l oop будет содержат исключенный конечный индекс после l oop, когда условие оценивается как false. Эта логика c также относится к вашей первой петле while; впоследствии i будет содержать первый неиспользованный индекс или использованную длину, обе интерпретации действительны. Последующее использование должно исключить это, используя <, что, как сказано, является обычным шаблоном. Для вашего обращения l oop это также означает, что индекс конца должен быть уменьшен перед использованием.

    Исправление l oop logi c исправит вашу проблему с ведущим нулем.

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String args[]) {
        int n = scanner.nextInt();
        int remainder, quotient, i=0;
        int[] binary=new int[n];
        /* Binary division -Extracting the 1's and 0's
           out of the base10 number and storing it in binary[] */
        while(n!=0) {
            remainder=n%2;
            quotient=n/2;
            binary[i]=remainder;
            n=quotient;
            i++;
        }
        /*Reversing the binary[] to get the correct binary value.*/
        for(int j=0, k=i-1; j<k; j++,k--) {
            int temp=binary[j];
            binary[j]=binary[k];
            binary[k]=temp;
        }
        /*Printing out all the bits of binary number. */
        for(int l=0; l<i; l++) {
            System.out.print(binary[l]);
        }
        System.out.println();

        System.out.println(Arrays.toString(binary));
    }
}
25
11001
[1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
...