Как отслеживать элементы массива, которые уже были напечатаны, и пропускать их (Java)

#java #arrays #printing

Вопрос:

Я пишу программу, которая отслеживает количество неуникальных элементов в массиве и печатает их вместе с их частотой. Проблема с моим текущим кодом заключается в том, что он будет печатать повторяющиеся числа более одного раза. Я просто хочу напечатать не уникальный номер и его частоту один раз, но я не могу понять, как это сделать. Вот моя текущая логика. Любая помощь будет очень признательна.

 int numNonUnique = 0;
  int N = A.length;
  for (int i = 0; i < N; i  ) 
    {
        int count=0;
        for (int j = 0; j < N; j  ) 
        {
            if (A[i] == A[j])
                count  ;
        }
      if(count>1)
      {
          numNonUnique = count;
          int currentNum = A[i];
          System.out.println(currentNum   " -> "  numNonUnique);

      
      }
    }
 

Комментарии:

1. Попробуйте добавить их в a hashset() и использовать contains() и оператор «если», чтобы увидеть, есть ли это число: если его нет, распечатайте его, если есть, пропустите его( continue ). Полезная ссылка: использование contains() .

2. Вам нужно отслеживать, был ли персонаж замечен ранее или нет

3. Есть ли другой способ сделать это, который не включает в себя hashset(). мы еще не научились этому в нашем классе, поэтому я не решаюсь его использовать. я чувствую, что есть более простой способ сделать это.

4. хорошо, вы не хотите использовать какое-либо хранилище?

5. я не знаю, что вы подразумеваете под хранением? моя идея состояла в том, чтобы, возможно, сохранить повторяющиеся значения в массиве после того, как они будут напечатаны один раз, но я не могу понять, как сравнить ранее напечатанные значения со значением, которое будет напечатано. имейте в виду, что я начал изучать java всего месяц назад.

Ответ №1:

 //Initialize array
int[] A = {-1, 2, 3, 1, 2, 4, 7, 8, 7, -1};
int numNonUnique = 0;
//Array frequency will store frequencies of element
int [] frequency = new int [A.length];
int visited = -1;
for(int i = 0; i < A.length; i  ){
  int count = 1;
  for(int j = i 1; j < A.length; j  ){
    if(A[i] == A[j]){
      count  ;
      //To avoid counting same element again
      frequency[j] = visited;
    }
  }
  if(frequency[i] != visited) frequency[i] = count;
}

//Displays the frequency of each element present in array
for(int i = 0; i < frequency.length; i  ){
  if(frequency[i] != visited amp;amp; frequency[i]>1){
    numNonUnique  ;
    System.out.println(A[i]   " -> "  frequency[i]);
  }
}

System.out.println("Non unique count :  "  numNonUnique);
 

Комментарии:

1. хорошо, большое вам спасибо, есть ли способ сделать это, если -1 может быть числом в массиве? просто любопытно, потому что я хочу лучше понять концепцию.

2. Сначала посмотрите объяснение, а затем давайте разберемся

3. итак, теоретически я мог бы сделать -1 любым числом или, может быть, символом? это просто какой-то маркер для отслеживания мест, где цифры повторяются?

4. ДА. Но поскольку мы используем массив типа int int[] A , вы не можете добавить символ или строку, нам нужно добавить любое числовое число, которое может быть 9999 или -99

5. хорошо, спасибо. надеюсь, когда я сдам задание, мой профессор не будет использовать массив со значением sentinel, которое я использую. но сделать это каким-то другим способом кажется слишком сложным.