【问题标题】:array with non repeating numbers from a range in ascending order, java具有非重复数字的数组以升序排列,java
【发布时间】:2014-03-31 07:02:10
【问题描述】:

我试图生成一个数组,其中包含 1000 个整数的非重复数字,按从 0 到 10,000 的升序排列

到目前为止,我拥有的是:

 public static void InitArray(int[] arr) { // InitArray method
     int i, a_num; // int declared
     Random my_rand_obj = new Random(); // random numbers

     for (i = 0; i <= arr.length-1; i++) // for loop
     {
        a_num = my_rand_obj.nextInt(10000); // acquiring random numbers from 0 - 10000
            arr[i] = a_num; // numbers being put into array (previoulsy declared of size 1000)
     }

  }
public static void ShowArray(int[] arr) { // ShowArray method
     int i; // int declared
     for (i = 0; i <= arr.length-1; i++) { // for loop
        System.out.print(arr[i] + " "); // show current array content
     }
     System.out.println(); // empty line
  }
public static void Sort(int[] arr) { // SortArray method
     int i, min, j; // int decalred
     for (i = 0; i < arr.length-1; i++) { // for loop
        min = i; // min is i
        for (j = i + 1; j < arr.length; j++) { // nested for loop
           if (arr[j] < arr[min]) { // if statement
              min = j; // j is the new minimum
           }
        }       
        int swap = arr[min]; // swap "method"
        arr[min] = arr[i];
        arr[i] = swap;
     }  
  }

有什么方法可以检查数字不重复吗?除了随机生成器之外,是否还有一个功能可以让我生成数字而不重复?感谢您的帮助

【问题讨论】:

  • 您可以简单地通过使用索引迭代 for 循环来生成数字 - 它会满足您的要求。
  • 如果你想确保有非重复元素,将你的数组转换为 HashSet,对其进行排序并检查它的大小与数组的大小..(还有其他几种“有效”的方法也一样。)。顺便说一句,您正在重新发明轮子.. Set 只允许唯一值,为什么不使用它而不是数组?
  • How to generate random unique numbers? - 这应该是一本不错的读物,然后您可能可以将Set/List 转换为数组并使用Arrays.sort() 对其进行排序。

标签: java arrays sorting


【解决方案1】:

您可以声明大小为 10,000 的数组 并初始化数组,使数组中的每个单元格都将保存其索引的值:

int [] arr= new  int[10000];
for (int i=0 i < arr.length; i++){
     arr[i] = i
}

现在您可以使用 java Collections 对数组进行洗牌。 并从数组中取出前 1000 个项目,然后使用 java sort 进行排序。

【讨论】:

  • OP 需要随机编号。来自0-10,000 好的,但是 OP 只需要一个大小为 1,000 的数组。
  • 按照我在答案中提到的那样,他应该采取前 1000 项。
【解决方案2】:

我相信这样就可以了..

HashSet hs = new HashSet();
for(int i=0;i< arr.length;i++)
    hs.add(arr[i]);
List<Integer> integers=new ArrayList<>(hs);
Collections.sort(integers);

【讨论】:

  • 不公平...我只是要写那个! ;-)
  • @ambigram_maker LOL ;-)
【解决方案3】:

一个非常简单的解决方案是巧妙地生成数字。我有一个解决方案。虽然它可能没有均匀分布,但它尽可能简单。所以,这里是:

public static int[] randomSortedArray (int minLimit, int maxLimit, int size) {
    int range    = (maxLimit - minLimit) / size;
    int[] array = new int[size];
    Random rand = new Random();
    for (int i = 0; i < array.length; i++ ) {
        array[i] = minLimit + rand.nextInt(range) + range * i;
    }
    return array;
}

因此,在您的情况下,将方法称为:

int randomSortedArray = randomSortedArray(0, 10_000, 1_000);

它非常简单,不需要任何排序算法。它只是运行一个循环,使其在线性时间内运行(即它是time complexity = O(1))。

因此,您会在难以置信的时间内获得一个随机生成的“预排序”int[]int 数组)!

如果您需要对该算法的解释,请发表评论(尽管它相当简单)。

【讨论】:

    猜你喜欢
    • 2014-03-06
    • 2016-02-24
    • 1970-01-01
    • 2021-11-07
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    相关资源
    最近更新 更多