Чтение и хранение уникальных значений в массиве (JAVA) - PullRequest
1 голос
/ 27 апреля 2011

Итак, у меня проблема с домашним заданием по Java.Задача состоит в том, чтобы написать программу, которая читает десять чисел и отображает только разные числа вместе с количеством разных значений.то, что я получил до сих пор, это ...

import java.util.Scanner;
import java.util.Collection;

public class Exercise06_05 {
    public static void main(String[]args){
        Scanner input = new Scanner(System.in);
        int[] list = new int[10];//create my new 10 slot array
        //i really want a variable length array but alas

        for (int i = 0; i < 10; i++){//get and check the ten input variables
            System.out.println("Enter an Integer");//ask for input
            int integer = input.nextInt();//assign the input to a temp variable
            if (isUnique(list, integer)){//check if the temp is unique to the array
                list[i] = integer;//if so assign it
            }
        }



       String output = "";
       int j = 0;
       for (j = 0; j < list.length; j++){
           if(list[j] != 0){//this is where the error accours
                   output += (list[j] + " ");
           }else
               break;//this break ensures J doesn't get any higher
           //so that i can plug that in for the number of distinct variables
       }
       System.out.println("The number of distinct numbers is " + j);
       System.out.println(output);//print output, and the number of distinct values


    }
           public static boolean isUnique(int [] arry, int a){// my masterpiece of a method
             for (int i = 0; i < (10);){
              if (arry [i] == a){//check box
                return false;//not unique
             } else if (i == (arry.length - 1)){//we done yet?
                return true;//if so, return that it's unique
             }else//if we're not done increment the box
               i++;//there that is
             } return false;//now put this here just to safeguard


       }

   }

Это работает нормально, если пользователь не введет два одинаковых целых числа подряд в строку, например 1, а затем снова 1Происходит следующее: программа не сохраняет второе значение типа int, массив сохраняет ноль, а затем завершается с ошибкой в ​​части создания выходных данных.Как мне обойти это?

Ответы [ 4 ]

2 голосов
/ 26 ноября 2012

Хорошо, это немного по-другому, речь идет не об ответе на ваш вопрос, вы уже сделали это, а о том, чтобы немного больше сосредоточиться на вашем решении.Вы сначала читаете список чисел, а затем оперируете этими числами.Вот еще один фрагмент:

loop = 0;

/**Start Reading your numbers from stdin or anything**/
while(There are numbers to read){

    int number = read_number(), counter = 0, found = 0;

    while(counter <= loop){
        if(a[counter] == number){ 
            found = 1; // you found a match for this number break here 
            break;
        }

        counter++;  
    }

    if(found == 0){
        /* We did not find our number in array*/
        a[counter] = number;
    }
}

То есть он читается только один раз и зацикливается только один раз.

0 голосов
/ 27 апреля 2011

Даже если значение не сохранено, i увеличивается на 1.

Одно из решений:

if (isUnique(list, integer)){//check if the temp is unique to the array
            list[i] = integer;//if so assign it
        }
else
{
    list[i] = 0;
}

, которое будет хранить 0 в ячейке, иначе ничего не будет (даже не0) в ячейке, и программа падает.

Вместо этого, если вы хотите получить другое значение для ячейки, уменьшите i на единицу вместо присвоения 0 ячейке.

0 голосов
/ 27 апреля 2011

Ну, во-первых, если полученное вами число уникально, вы вставляете его в массив. Если он не уникален, вы не вставляете его в массив, но все равно увеличиваете индекс массива. Таким образом, вы собираетесь оставить его со значением инициализации по умолчанию, равным нулю.

Есть две проблемы с этим.

  1. Нет способа отличить «дублирующее значение» от «нуля». Если ноль не является допустимым значением, тогда все в порядке. Если ноль допустим, это не сработает.

  2. Более фундаментально: когда вы перебираете массив на выходе, вы выходите, когда достигаете первого нуля. Поэтому, если пользователь ввел, скажем, 1,2,4,2,3,4, вы собираетесь заполнить ваш массив 1,2,4,0,3,0. Затем, когда вы отобразите вывод, вы собираетесь написать 1,2,4, увидеть ноль и выйти и объявить, что есть 3 уникальных значения. Вы никогда не достигнете 3.

Я не знаю, как много они уже научили вас о доступных структурах данных. Лучшим решением было бы использовать ArrayList, а не массив, а затем добавлять его в ArrayList только тогда, когда входящее значение уникально. Если вы еще не узнали об этом, другой идеей будет сохранить счетчик количества уникальных значений по мере продвижения. Не вставляйте в массив, когда вы получите повторяющееся значение, а также не увеличивайте счетчик. То есть, иметь один счетчик, это позиция в массиве, которая равна количеству уникальных значений. Имейте другой счетчик, который является числом прочитанных входных значений. Это будет больше, чем позиция массива, как только вы увидите первый дубликат.

Включено, на одной детали, не связанной напрямую с вашим вопросом: почему в вашей функции isUnique вы зацикливаетесь на жестко заданной десятке, а затем у вас есть отдельный оператор IF для проверки длины массива и разрыва, когда дойти до конца? Было бы намного проще и легче читать, если бы вы закодировали:

public static boolean isUnique(int [] arry, int a)
{
  for (int i = 0; i < arry.length)
  {
    if (arry [i] == a)
    {
      return false; //not unique
    }
  }
  return true; // we made it through without finding a dup, must be unique
}

Или, если, как я предлагаю выше, у вас есть отдельная переменная, чтобы сказать, какая часть массива фактически заполнена:

public static boolean isUnique(int [] arry, int filled, int a)
{
  // filled should always be <=arry.length, but we can check both just to be safe
  for (int i = 0; i < arry.length && i<filled)
  {
    if (arry [i] == a)
    {
      return false; //not unique
    }
  }
  return true; // we made it through without finding a dup, must be unique
}
0 голосов
/ 27 апреля 2011

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

Выполнение int[] list = new int[10] означает, что list.length всегда будет 10.

Либо переключайтесь из массива в список, либо отслеживайте вставленный номер.

...