2016-02-10 4 views
0

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

Я беру два ИНТ значения (х и у) и создание двух различных массивов: первый (размер х) будет печатать массив, начинающийся с x и спускающийся вниз до 1. Второй (размер y) будет принимать случайные значения из первого массива (размер x) и хранить его в своем собственном массиве. Затем я распечатаю второй массив. Однако второй массив не может иметь никаких повторяющихся значений. Например, если массив был размером 10, он не мог иметь две одинаковые цифры в своих 10 отдельных индексах. Я пытаюсь сохранить уникальные элементы во втором массиве, создав два массива, один логический для проверки уникальных элементов, а другой - для хранения этих уникальных элементов. Вот мой код:

/* 
* user will enter desired size x for first array labeled arr_1 
* arr_1 will contain values descending from x down to 1 
* user will enter desired size y for second array labeled arr_2 
* arr_2 will contain random values taken from arr_1 w/o repeating numbers 
*/ 

import java.util.Arrays; 
// import java.util.Arrays; 
import java.util.Random; 
// import java.util.Scanner; 
public class Prog1B 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("Program 1B, Christopher Moussa, masc1574"); 
     // Scanner scnr = new Scanner(System.in); 
     int x = 20; 
     int v = x; 
     int[] arr_1 = new int[x]; 

     for (int i = x-1; i >= 0; i--) 
     { 
      arr_1[i] = v; // System.out.print(i+1 + " "); prints 20, 19, ... , 1 
      v--;   // System.out.print(arr_1[i] + " "); prints 20, 19, ... , 1 
     } 
     // int[] b = unique(arr_1); 
     System.out.println(Arrays.toString(unique(arr_1))); 
    } 

    public static int[] unique (int[] n) 
    { 
     boolean[] seen = new boolean[n.length]; 
     int[] unique = new int[n.length]; 
     Random rand = new Random(123L); 
     for (int i = 0; i < n.length; i++) 
     { 
      int index = rand.nextInt(n.length); 
      while (seen[index]) 
      { 
       index = rand.nextInt(n.length); 
      } 
      unique[i] = n[index]; 
     } 
     return unique; 
    } 



} 

код компилируется и работает, но он по-прежнему печатает массив с повторяющимися значениями. Я пытаюсь написать программу, чтобы она не печатала массив с повторяющимися значениями, а только уникальные значения. Есть ли у вас какие-либо предложения относительно того, где проблема? Я уверен, что он лежит в «уникальном» методе, более конкретно, когда логический массив проверяет уникальные значения (я заметил, что при попытке отладки это, даже если случайный индекс, который он сгенерировал, не был уникальным, он все же пропустил условие while и распечатал его). Я начинающий программист (первокурсник в штате Сан-Диего, изучающий информатику), и любые отзывы/советы будут очень признательны. Большое вам спасибо.

+0

Какова цель o f используя случайные индексы? – diziaq

+0

Почему бы не использовать набор вместо этого? У наборов не может быть дубликатов. – JimLohse

+0

Все это не Чегг, не решайте проблему для Кристофера, ведите его в правильном направлении на http://meta.stackexchange.com/questions/10811/how-do-i-ask-and-answer-homework -questions – JimLohse

ответ

2

Я нашел проблему в вашем коде. Вы никогда не обновляете свой «видимый» булевский массив. Смотрите ниже код для исправления:

public static int[] unique (int[] n){ 
boolean[] seen = new boolean[n.length]; 
int[] unique = new int[n.length]; 
Random rand = new Random(123L); 
for (int i = 0; i < n.length; i++) 
{ 
    int index = rand.nextInt(n.length); 
    while (seen[index]) 
    { 
     index = rand.nextInt(n.length); 
    } 
    seen[index] = true; //boolean array updated 
    unique[i] = n[index]; 
} 
return unique; 

}

Используя это исправление, я был в состоянии получить ниже выход (который не имеет повторов):

[3, 11, 17, 10 , 16, 18, 15, 6, 14, 20, 7, 13, 1, 19, 9, 2, 5, 4, 12, 8]

+0

Я пошел и изменил свой DV на UP, просто прочитал ссылку, которую я опубликовал о том, как ответьте на домашнюю работу и, возможно, просто сделайте предложения до тех пор, пока не начнется домашнее задание, я приведу соответствующий текст комментария к заявлению Санчиты. – JimLohse

+0

@ JimLohse Хорошо, спасибо за разъяснение. –

+0

Большое спасибо Бенджамен Лоури! Я смог обновить свой код, и он работал точно так же, как и ваш. –

1

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

Set<int> mySet = new HashSet<int>(Arrays.asList(someArray)); 

ПРИМЕЧАНИЕ: Вы хотите изменить тип возвращаемого значения of unique(), который должен быть установлен

Остальная реализация реализована в качестве упражнения для читателя. В основном вы берете массив и преобразовываете его в набор в качестве примера выше.

(Credit where credit is due)

Я просто хотел, чтобы направить вас в правильном направлении на https://meta.stackexchange.com/questions/10811/how-do-i-ask-and-answer-homework-questions

Удачи, я бы сказал, самый большой урок, как уйти от кода, который становится неэффективным, когда лучшее решение существует. Удачи!

+0

Я также рассматривал этот подход, пытаясь придумать, как решить эту проблему; Я подошел к моему учителю об использовании Хэш-набора, и она сказала, что предпочтет, чтобы я его не использовал (мы еще не перешли наборы). Большое спасибо за совет, хотя, я определенно буду использовать его для хорошего использования. –

+0

@ ChristopherMoussa Да, спасибо за самый документ, который я связал, он отмечает, что часто домашняя работа налагает ограничения, хорошее мышление! Пребывание на шаг впереди плана урока будет вам хорошо :) – JimLohse

+0

@ Кристофер и не забудьте принять один из других ответов в соответствии с этими рекомендациями, тот, который фактически решил вашу проблему (не мой ха-ха) http: // stackoverflow.com/help/someone-answers «Что делать, если кто-то отвечает на мой вопрос» – JimLohse

2

Вам нужно даже установить массив в виде [index] = true;

public static int[] unique (int[] n) 
    { 
     boolean[] seen = new boolean[n.length]; 
     int[] unique = new int[n.length]; 
     Random rand = new Random(123L); 
     for (int i = 0; i < n.length; i++) 
     { 
      int index = rand.nextInt(n.length); 
      while (seen[index]) 
      { 
       index = rand.nextInt(n.length); 
      } 
      unique[i] = n[index]; 
      seen[index] = true; 
     } 
     return unique; 
    } 
+0

Изменен мой DV до УФ, но за смс на ответ Бенджамина: «Обычно лучше не предоставлять полный образец кода, если вы считаете, что это не будет помогите студенту, используя ваше лучшее мнение. Сначала вы можете использовать псевдокод и, в духе создания ресурса программирования, вы можете вернуться через подходящее время и отредактировать свой ответ, чтобы включить более полный код. , студент все еще должен написать свой собственный код, но полное решение может стать доступно после окончания задания ». С http://meta.stackexchange.com/questions/10811/how-do-i-ask-and-answer-homework-questions – JimLohse

0

Heres, как сделать это с помощью java8 лямбды

ArrayList<Integer> arrayli = new ArrayList<Integer>(Arrays.asList(arr_1));//converted array to list 
    System.out.println(); 
    List<Integer> distinctIntegers = arrayli.stream(). 
    .distinct() 
    .boxed() 
    .collect(Collectors.toList()); 
distinctIntegers.foreach(System.out::println); 
Смежные вопросы