在 Java 8 中生成随机短数组

Posted

技术标签:

【中文标题】在 Java 8 中生成随机短数组【英文标题】:generate Array of random short in Java 8 【发布时间】:2020-05-22 03:27:39 【问题描述】:

我在一个项目中找到了这段代码:

public static Integer[] getArrayInt(int size, int numBytes) 
  return IntStream
      .range(0, size)
      .mapToObj(time -> 
        return extractValue(getArrayByte(numBytes * size), numBytes, time);
      ).collect(Collectors.toList()).toArray(new Integer[0]);


public static byte[] getArrayByte(int size) 
  byte[] theArray = new byte[size];
  new Random().nextBytes(theArray);
  return theArray;


private static int extractValue(byte[] bytesSamples, int numBytes, int time) 
  byte[] bytesSingleNumber = Arrays.copyOfRange(bytesSamples, time * numBytes, (time + 1) * numBytes);
  int value = numBytesPerSample == 2
      ? (Byte2IntLit(bytesSingleNumber[0], bytesSingleNumber[1]))
      : (byte2intSmpl(bytesSingleNumber[0]));
  return value;


public static int Byte2IntLit(byte Byte00, byte Byte08) 
  return (((Byte08) << 8)
      | ((Byte00 & 0xFF)));


public static int byte2intSmpl(byte theByte) 
  return (short) (((theByte - 128) & 0xFF)
      << 8);

怎么用?

Integer[] coefficients = getArrayInt(4, 2);

输出:

coefficients: [8473, -12817, 12817, -20623]

这个answer 的随机缩写很有吸引力,但它只需要一种方法(正面和负面)。

显然是一个长代码,用于获取带有流的随机短数组。

我知道如何使用 for 循环和替代方法提出解决方案。

问题:向我推荐什么更快和优化的代码以获得它?

【问题讨论】:

你应该遵循Java命名约定:变量名和方法名应该用驼峰命名; PascalCase 中的类名。 目前尚不清楚所有这些发布的代码如何与“”任务相关。该代码的目的似乎与此相去甚远。此外,短语“但它只需要一种方法(正面和负面)”表明您不理解链接的答案,它提供了两种选择,您可以根据需要从中选择。如果该方法应该返回正值和负值,则需要 16 位变体。作为旁注,extractValue 效率极低,执行完全过时的数组复制操作。 【参考方案1】:

清晰简单的解决方案:

public static Integer[] getArrayInteger(int size) 
  return IntStream.generate(()
      -> ThreadLocalRandom.current().nextInt(Short.MIN_VALUE, -Short.MIN_VALUE))
      .limit(size).boxed().toArray(Integer[]::new);


public static Short[] getArrayShort(int size) 
  return IntStream.generate(()
      -> ThreadLocalRandom.current().nextInt(Short.MIN_VALUE, -Short.MIN_VALUE))
      .limit(size).boxed().map(i -> i.shortValue())
      .toArray(Short[]::new);

-Short.MIN_VALUE 喜欢第二个参数,以便获得 Short.MAX_VALUE 包含在内,因为 nextInt 的第二个参数是专有的。

【讨论】:

这将抛出一个InputMismatchException,因为生成的Integer[] 无法转换为Short[] .boxed().map(i -&gt; i.shortValue()) 正在对Integer 值执行完全过时的装箱,只是.mapToObj(i -&gt; (short)i) 做得更好。除此之外,使用ThreadLocalRandom.current().ints(size, Short.MIN_VALUE, -Short.MIN_VALUE)创建IntStream更简单、更高效,尤其是当终端操作为toArray时,因为此时实现会利用已知的大小。

以上是关于在 Java 8 中生成随机短数组的主要内容,如果未能解决你的问题,请参考以下文章

在Java中生成随机单词?

如何在 Java 中生成随机排列?

如何在java中生成6个不同的随机数

如何在数组中生成随机数,加起来达到定义的总数?

在java中生成6位pin

使用循环在数组中生成唯一的随机数