尝试打印阵列而不重复数字

时间:2016-02-10 03:50:24

标签: java arrays unique-values

我有一个编程任务,我的任务是:

我正在获取两个int值(x和y)并创建两个不同的数组:第一个(大小为x)将打印一个从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条件和打印出来)。我是一名初学程序员(在圣地亚哥州学习计算机科学的新生),任何反馈/建议将不胜感激。非常感谢你。

4 个答案:

答案 0 :(得分:2)

你甚至需要设置你的数组[index] = true;

var characterName = document.getElementById("pilotName").value;
var characterID = 0;
var charSecStatus = 0;
var corpName = " ";
var allianceName = " ";


//callback
makeRequest('https://api.eveonline.com/eve/CharacterID.xml.aspx?names=' + characterName, function() {
  if (xmlhttp.status == OK_RESPONSE) {

    //read character info
    characterID = xmlhttp.responseXML.getElementsByTagName("row")[0].getAttribute("characterID");

    makeRequest('https://api.eveonline.com/eve/CharacterInfo.xml.aspx?characterID=' + characterID, function() {

      if (xmlhttp.status == OK_RESPONSE) {

        //read character info 
        characterID = xmlhttp.responseXML.getElementsByTagName("characterID")[0].innerHTML;
        charSecStatus = xmlhttp.responseXML.getElementsByTagName("securityStatus")[0].innerHTML;
        corpName = xmlhttp.responseXML.getElementsByTagName("corporation")[0].innerHTML;
        allianceName = (xmlhttp.responseXML.getElementsByTagName("alliance")[0] || {
          innerHTML: ""
        }).innerHTML;
      }
    });
  }
});

答案 1 :(得分:2)

我在您的代码中发现了问题。你永远不会更新你所看到的&#34;布尔数组。请参阅以下代码以获取修复:

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]

答案 2 :(得分:1)

除非你特意这样做,否则我建议你退后一步,尝试一种完全不同的方法,如下所示:

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

注意:您需要调整unique()的返回类型以设置

其余的实施留给读者作为练习。基本上你把数组转换成一个集合作为上面的例子。

Credit where credit is due

我只是想按照https://meta.stackexchange.com/questions/10811/how-do-i-ask-and-answer-homework-questions

引导你朝着正确的方向前进

祝你好运,我想说这里最大的教训是如何摆脱存在更好解决方案时效率低下的代码。祝你好运!

答案 3 :(得分:0)

Heres是如何使用java8 lambdas

执行此操作的
    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);