2017-06-27 2 views
-1

Ich versuche, von 0 bis n zu zählen und den Wert in binär darzustellen. Bei Verwendung von Java ist dies mit Integer.toBinaryString() einfach. Ich möchte jedoch die Ausgabe in der Reihenfolge einer Anzahl von Einsen erzeugen. Zum Beispiel zählt 0-7:Zählen im Binärformat von der niedrigsten Anzahl von 1s zur größten Anzahl von 1s (Java)

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

Bestellung innerhalb einer „Klasse“ (ein 1, zwei 1en usw.) etwas irrelevant im Kontext des Problems bin ich zu lösen. So 011, 101, könnte 110 110 sein, 011, 101.

Anstelle der folgenden, die ein Ergebnis von 0 bis 7 ist das Zählen, und bekommen die Binärkette:

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

kann ich nicht scheinen mein Gehirn darum zu kümmern, wie man sich diesem nähert.

+1

Entschuldigung. Aber Sie haben nur Arbeitsaufträge aufgegeben. Enthalten Sie, was Sie bisher versucht haben! – GhostCat

+0

@GhostCat Was lässt dich denken, dass dies eine Hausaufgabenfrage ist? Zum Enthalten von Code sind nur Debug-Fragen erforderlich. https://meta.stackexchange.com/a/224104/244864 https://meta.stackexchange.com/a/215220/244864 https://meta.stackoverflow.com/a/259947/2891664 https: // meta .stackoverflow.com/a/259950/2891664 – Radiodef

+0

@Radiodef Was lässt dich denken, dass es etwas anderes ist? – GhostCat

Antwort

4

Was für Ihre Suche ist Integer.bitCount(i) (verfügbar seit Java 1.5), die die Anzahl der Ein-Bits zurückgibt.

Mit Java 8 können Sie Ihre Zahlen in ein Array speichern und sortieren sie nach bitCount aufsteigend:

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)); 

Oder, wenn Sie die Java 8 Streams verwenden:

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

Wenn Sie Java 8 nicht verwenden können, ist die Comparator etwas komplizierter:

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)); 
+0

@Radiodef können wir stattdessen ['BitSet'] (https://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html) auch ich denke, wir können diese Zahlen in einem mehr generieren effizienter Weg – Oswald

+1

@Radiodef: danke für Hinweis. Ich habe meine Antwort mit einer Lösung für Java 1.5 bis 1.7 aktualisiert –

+1

Nizza. Er hat sein Hausgemacht und du hast den ganzen Code fallen lassen. – GhostCat

0

Wenn Sie sagen, dass Sie die Ausgabe bestellen möchten, scheint es, dass Sie sortieren möchten. Dies könnte auf viele Arten geschehen, aber es würde letztendlich darauf hinauslaufen, eine Comparator zu schreiben.

Hier ist ein Beispiel unter Verwendung von 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); 
    } 
} 
Verwandte Themen