以最小1s到最大1s(Java)的二进制计数

时间:2017-06-27 04:09:59

标签: java

我试图从0到 n 计数,并用二进制表示值。使用Java,使用Integer.toBinaryString()很容易。但是,我想以1的数量级生成输出。例如,计数0到7:

[000, 001, 010, 100, 011, 101, 110, 111]

在我正在解决的问题的背景下,在“类”(一个1,两个1等)中进行排序有点无关紧要。所以011,101,110可以是110,011,101。

而不是以下,这是计数0到7的结果,并获得二进制字符串:

[000, 001, 010, 011, 100, 101, 110, 111]

我似乎无法围绕如何处理这个问题。

2 个答案:

答案 0 :(得分:4)

您搜索的是Integer.bitCount(i)(自Java 1.5起可用),返回一位数。

使用Java 8,您可以将数字存储到数组中,然后按bitCount升序对其进行排序:

    Integer[] numbers = new Integer[8];
    for (int i = 0; i < 8; i++) numbers[i] = i;
    Arrays.sort(numbers, Comparator.comparingInt(Integer::bitCount));
    System.out.println(Arrays.toString(numbers));

或者如果您想使用Java 8 Streams:

    List<Integer> numbers = IntStream.range(0, 8)
            .boxed()
            .sorted(Comparator.comparingInt(Integer::bitCount))
            .collect(Collectors.toList());
    System.out.println(numbers);

如果你不能使用Java 8,那么Comparator稍微复杂一些:

    for (int i = 0; i < 8; i++) numbers[i] = i;
    Arrays.sort(numbers, new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return Integer.bitCount(o1)-Integer.bitCount(o2);
        }
    });
    System.out.println(Arrays.toString(numbers));

答案 1 :(得分:0)

当您说要订购输出时,似乎这意味着您要对其进行排序。这可以通过多种方式完成,但最终归结为编写Comparator

以下是使用bitCount的示例:

import java.util.*;
import java.util.stream.*;
import static java.util.stream.Collectors.*;
class Example {
    public static void main(String[] args) {
        Set<Integer> set =
            new TreeSet<>(Comparator.comparingInt(Integer::bitCount)
                                    .thenComparing(naturalOrder()));
        IntStream.rangeClosed(0, 7)
                 .forEach(set::add);
        String s = set.stream()
                      .map(Integer::toBinaryString)
                      .collect(joining(", ", "[", "]"));
        // [0, 1, 10, 100, 11, 101, 110, 111]
        System.out.println(s);
    }
}