Как мне сделать, чтобы мой массив печатал повторы ввода один раз?(ДЖАВА) - PullRequest
0 голосов
/ 17 декабря 2018

Мне нужно разработать программу, которая принимает произвольный ввод от 0-50 , печатает все входов ОДИН , а затем печатает из вхождения каждого входа.

У меня это работает в некоторой степени, но, когда вход: 1, 2, 3, 3, 3, 6, 9, 0, 0

Распечатывается:

Ввод: Вхождение

     Number   Times
      1         1
      2         1
      3         1
      3         2
      3         3
      6         1
      9         1
      0         1
      0         1

вместо:

Входные данные: вхождение

     Number Times
       0    2
       1    1
       2    1
       3    3
       6    1
       9    1

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

 public static void main(String [] args)
{

   int[] array = new int[51];
   Scanner scan = new Scanner(System.in);
   System.out.println("Number \t   Times");

   while (scan.hasNext()){    
    int x = scan.nextInt();
    if (x>=0 && x<=50){
        array[x]++;
  System.out.println(x + "\t      " + array[x]);
      }
    }
  }
}

Я пробовал несколько способов форматирования циклов, но я не могу понять, как заставить его печатать число, которое вводится несколько раз только один раз.

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Добро пожаловать на SO.Самый простой способ решить эту проблему, не используя карты и даже не сохраняя значения в любом месте, - сначала отсортировать массив (приведенный вами пример уже отсортирован), а затем просто подсчитать количество смежных дубликатов.

В pseduo-код алгоритма должен выглядеть примерно так:

count = 1
value = array[0];
for each item from 1 to length
    if item == value
        increment count
    else
        print value: count
        count = 1
        value = item
print value: count

Обратите внимание, что должно быть 2 выхода - каждый раз, когда значение изменяется и в конце списка.В идеале вы должны хранить значение и считать в объекте, чтобы избежать дублирования кода, но я предполагаю, что это слишком продвинуто на этом этапе.

Надеюсь, вы можете преобразовать это в код относительно легко.

0 голосов
/ 17 декабря 2018

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

int[] numbers = new int[51];

// Small loop to get the number input
Scanner scanner = new Scanner(System.in);
for (int i=0; i<10; i++) {
    System.out.print("> ");
    int x = scanner.nextInt();

    if (x >= 0 && x <= 50) {
        numbers[x] += 1;
    }
}

// Now display the results after getting input
System.out.println("Number \t     Times");
for (int i=0; i<numbers.length; i++) {
    if (numbers[i] != 0) {
        System.out.println(i + "\t\t" + numbers[i]);
    }
}
0 голосов
/ 17 декабря 2018

Добро пожаловать в сообщество StackOverflow!Я знаю, что вы упомянули, что вы еще не узнали о «продвинутых методах картирования», но почему бы не узнать о них сейчас?В любом случае, есть большая вероятность, что они вам понадобятся снова.

Мы легко можем решить эту проблему, используя так называемый «хэш-карту».Хэш-карта полезна, потому что она позволяет хранить два значения в каждом индексе, ключ и значение.Это полезно, потому что ключ связан со значением (что означает, что вы можете найти значение, если у вас есть ключ), и не может быть повторяющихся ключей.

Вот пример использования хеш-карт для решения вашихпроблема.

// Here we create our hashmap. Be adding <Integer, Integer>, we are telling the hashmap
// that the the key and value will be of type Integer (note that we can't just pass in int)
HashMap<Integer, Integer> numbers = new HashMap<Integer, Integer>();

Scanner scan = new Scanner(System.in);
System.out.println("Number \t   Times");

while (scan.hasNext()){    
  int x = scan.nextInt();
  if (x>=0 && x<=50){

      // Check if the number has already been added
      // to the hash map
      if (numbers.containsKey(x)) {
          // If so, we will get the existing value
          // and increase it by 1
          numbers.put(x, numbers.get(x) + 1);
      }

      else {
          // Otherwise we will add the value
          // to the hash map
          numbers.put(x, 1);
      }

      System.out.println(x + "\t      " + numbers.get(x));
  }
}
...