改组数组(Java)

时间:2019-05-12 22:12:25

标签: java shuffle

我正在尝试随机调整数组中的整数。这似乎很简单,但是我必须对它们进行洗牌,以便它们仍然保持特定的顺序(奇数,偶数,奇数,偶数等)。例如,如果原始数组包含[1、2、3、4、5、6、7、8],则改组后的数组可能看起来像[5、8、7、4、1、6、3、2],但始终保持相同的交替顺序,从奇数开始。

感谢您的帮助。 顺便说一句,这不是我的确切作业问题。我只想弄清楚该如何做才能做作业。我不知道从哪里开始。

4 个答案:

答案 0 :(得分:4)

我可能会:

  1. 将ODD索引位置的所有元素都放入一个单独的位置 排列并随机播放
  2. 将偶数索引位置处的所有元素都捕获到一个单独的数组中,并将其洗牌;然后
  3. 将它们拼接在一起

答案 1 :(得分:0)

一种改组数组的方法是“随机排序”项目。

例如,如果您使用的是Java 8或更高版本,则可以提供一个如下所示的lambda排序比较器,该排序比较器在排序操作期间的每次迭代中仅返回正或负索引以获得改组的结果:

#!/usr/bin/env python3
import os

perlscript = "perl " + " perlscript.pl " + " /home/user/Desktop/data/*.txt " + " >> " + "/home/user/Desktop/results/output.txt"
os.system(perlscript)

答案 2 :(得分:0)

<script type="text/javascript">
 $(document).ready(function() {

    $('select[name="productCategory"]').on('change', function() {
        console.log($(this).val());
        var categoryID = $(this).val();
        if(categoryID!=null) {

            $.ajax({
            type:"GET",
            title: "subCategory",
            url: "admin/Category/getSubCategory/"+categoryID,
            contentType: "application/json",
            datatype: "json",
            success: function(result){
                console.log("subCategory Success");

                parsedobj = JSON.parse(result);

                $('select[name="productSubCategory"]').empty();

                 parsedobj = JSON.parse(result)

                 var appenddata='';
                 var subCat = $('#productSubCategory');


                    $.each(parsedobj, function(index, value) 
                    {
                       $('select[name="productSubCategory"]').append('<option value="'+ value.subCategoryID +'">'+ value.subCategory +'</option>');


                        console.log("valueID : "+value.subCategoryID+" , "+"value.name : "+value.subCategory);
                    });

                    $('#productSubCategory').change();

            },
            error: function(xhr, textStatus, error){
                    console.log('categoryID failed');
                    console.log(xhr.statusText);
                    console.log(textStatus);
                    console.log(error);
            }
        });

        }else{
            $('select[name="productSubCategory"]').empty();
            console.log('categoryID is null');
        }
    });
});

数组为Collections.shuffle(Arrays.asList(array));
我得到输出[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

请注意,它不能与基本数组一起使用,[9, 5, 8, 2, 0, 7, 4, 3, 6, 1]不能仅与int[]一起使用

答案 3 :(得分:0)

您可以通过相应地实现List<Integer>作为相关元素的 view 来让数组的所需元素以AbstractList的形式出现{em}数组元素。然后,列表上的简单Collections#shuffle就可以解决问题。

乍一看,这似乎是“非常规的”,但具有一些优点:

  • 它可以在int个数组上运行(尽管您可以根据需要将其更改为Integer
  • 它不需要复制阵列(没有额外的内存开销)
  • 它不需要以任何方式(除对其进行改组外)“处理”数组

在此处以MCVE的形式实现:

import java.util.AbstractList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class ConstrainedShuffle
{
    public static void main(String[] args)
    {   
        int array[] = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };

        System.out.println("Before: " + Arrays.toString(array));

        constrainedShuffle(array, new Random(0));

        System.out.println("After : " + Arrays.toString(array));
    }

    private static void constrainedShuffle(int array[], Random random)
    {
        Collections.shuffle(asList(array, 0, 2), random);
        Collections.shuffle(asList(array, 1, 2), random);
    }

    private static List<Integer> asList(int array[], int offset, int stride)
    {
        int size = (array.length - offset + stride - 1) / stride;
        return new AbstractList<Integer>()
        {
            @Override
            public Integer get(int index)
            {
                return array[offset + index * stride];
            }

            @Override
            public Integer set(int index, Integer element)
            {
                int i = offset + index * stride;
                Integer old = array[i];
                array[i] = element;
                return old;
            }

            @Override
            public int size()
            {
                return size;
            }
        };
    }
}