Массив дает неправильный вывод? - PullRequest
0 голосов
/ 19 апреля 2020

Вход:

1
7
4 2 4 1 4 3 4

Выход:

[I@59e84876
4

Ожидаемый результат для массива должен быть [4 2 4 1 4 3 4], но почему он дает некоторую случайную строку в качестве вывода, но Hashset дает идеальный вывод.

import java.util.*;
import java.lang.*;

public class Main {
    public static void main(String[] args) {

        Scanner s = new Scanner(System.in);

        int n=s.nextInt();

        for(int i=0;i<n;i++){

            int no=s.nextInt();

            HashSet<Integer> h = new HashSet<>();
            int[] arr = new int[no];

            for(int j=0;j<arr.length;j++){
                int x=s.nextInt();
                arr[j]=x;
                h.add(x);
            }
        }

           System.out.println(arr);
           System.out.println(h);
    }
}

Ответы [ 2 ]

2 голосов
/ 19 апреля 2020

Прежде всего, в вашем коде есть ошибка. Вы должны инициализировать экземпляр массива HashSet и int [] из области видимости для l oop, чтобы получить к нему доступ за пределами области видимости этого l oop.

Если вы правильно поняли, тогда ответ на ваш Вопрос в том, когда вы печатаете массив Object.toString () вызывается метод. Который возвращает значение hashCode , как вы упомянули «случайную строку» в своем вопросе. С другой стороны, HashSet переопределяет метод toString () и возвращает строковое представление.

Как упомянуто в документации -

Возвращает строковое представление этой коллекции. Строковое представление состоит из списка элементов коллекции в том порядке, в котором они возвращаются ее итератором, заключенных в квадратные скобки ("[]"). Смежные элементы разделяются символами «,» (запятая и пробел). Элементы преобразуются в строки как String.valueOf (Object).

Итак, чтобы вывести строковое представление целочисленного массива в вашем коде, вы можете использовать класс Arrays из пакета util. Код был бы такой:

System.out.println(Arrays.toString(arr));

Если бы у вас был многомерный массив, вы могли бы использовать следующее:

System.out.println(Arrays.deepToString(arr));
0 голосов
/ 19 апреля 2020

Прежде всего, вам нужно определить arr и h перед / вне для l oop.
Во-вторых, если вы хотите, чтобы вывод вашего массива выглядел следующим образом - [4 2 4 1 4 3 4], есть 2 способа:
1. Использовать ArrayList вместо примитивного массива int, т.е.
List<Integer> arr = new ArrayList<Integer>(); и добавить записи.
2. Не печатать массив arr напрямую с помощью println(), вместо этого используйте al oop:

System.out.print("[");
for (int i: arr)
  if (i!=arr[arr.length-1])
    System.out.print(i + ",");
  else 
    System.out.print(i + "]");
...