首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >随机排列数组(Java)

随机排列数组(Java)
EN

Stack Overflow用户
提问于 2019-05-13 06:12:25
回答 4查看 1.6K关注 0票数 3

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

谢谢你的帮助。顺便说一下,这不是我真正的家庭作业问题。我只是想弄清楚怎么做,这样我才能做我的家庭作业。我不知道该从何说起。

EN

回答 4

Stack Overflow用户

发布于 2019-05-13 06:22:23

我可能会:

  1. 将奇数索引位置的所有元素放入单独的数组中,并将
  2. 将偶数索引位置的所有元素放入单独的数组中,然后
  3. 将它们拼接回一起
票数 5
EN

Stack Overflow用户

发布于 2019-05-14 07:08:48

您可以让所需的数组元素显示为List<Integer>,方法是相应地实现AbstractList,作为相关数组元素上的视图。然后,列表上的一个简单的Collections#shuffle就可以做到这一点。

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

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

<

  • >F212>

在此处作为MCVE实施:

代码语言:javascript
运行
复制
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;
            }
        };
    }
}
票数 1
EN

Stack Overflow用户

发布于 2019-05-13 06:30:29

混洗数组的一种方法是对项进行“随机排序”。

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

代码语言:javascript
运行
复制
ArrayList<Integer> list = new ArrayList<>();
Random random = new Random();

/* Ordered input list */
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);

/* Apply random sorting behavior to achieve obtain a shuffled array */
Collections.sort(list, (Integer a, Integer b) -> {
    /* Obtain random number between 0 - 1 */
    Integer randomValue = random.nextInt(1);

    /* Return random positive or negative value which causes "shuffled" 
    sort */
    return randomValue == 1 ? 1 : -1;
});

/* list is now shuffled */
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56103871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档