Zahlenkonvertierung

sk72

Mitglied
Hallo,

Ich habe zwei Methoden implementiert, die als Parameter ein Array mit boolean-Werten übergeben bekommen und eine Zahl darstellen. Die Zahl soll mittels der Methode in einen Octal-String umgewandelt werden. Funktioniert auch soweit - fast! Ab dem 10. Array Eintrag ist die Berechnung von toOctalString() falsch. Kann mir wer erklären wieso?

Java:
public class Test 
{


	public static void main(String[] args) 
	{
		boolean[] test1 = {false, true, false, true, true, false, false, false, false, false};
	
		System.out.println("test1: " +toOctalString(test1));
		System.out.println("test2: " +toOctalString1(test1));
	}
	
	public static String toBinaryString(boolean[] number) 
	{
		String rep = "";
		for (int i = 0; i < number.length; i++) {
			if (number[i]) rep += "1";
			else rep += "0";
		}
		return rep;
	}
	

	public static String toOctalString1(boolean[] number)
	{
		return Integer.toOctalString(Integer.parseInt(toBinaryString(number),2));
	}
	
	
	
	public static String toOctalString(boolean[] number)
	{
		String rep = "";
		String str = "";
		
		for (int i=0; i<number.length; i++)
		{
			if (number[i] == true)
				rep = rep +"1";
			else rep = rep +"0";
		}
		
		while (rep.length() % 3 != 0)
			rep = "0" +rep;
				
		if (rep.length() % 3 == 0)
		{
			for (int i=0; i<rep.length(); i++)
			{
				String buffer = rep.substring(0, 3);
				
				if (buffer.equals("000"))
					str = str + "0";
				else if (buffer.equals("001"))
					str = str + "1";
				else if (buffer.equals("010"))
					str = str + "2";
				else if (buffer.equals("011"))
					str = str + "3";
				else if (buffer.equals("100"))
					str = str + "4";
				else if (buffer.equals("101"))
					str = str + "5";
				else if (buffer.equals("110"))
					str = str + "6";
				else if (buffer.equals("111"))
					str = str + "7";
				
				rep = rep.substring(3, rep.length());	
			}
		}
	
		return str;
	}
	
}
 
S

SlaterB

Gast
rep wird immer kleiner, 12, 9, 6, 3
außerdem hast du eine i-Schleife, die 0, 1, 2, 3, 4 hochzzählt,

mit nur wenigen 3er-Blöcken kommt sich da nichts entscheidend in die Quere, aber wenn i auf 3 hochzählen will, zum 4. Block,
und der Reststring nur noch 3 lang ist, dann wird vorzeitig abgebrochen,
verbaue dort eine while-Schleife


schöner Fehler, da kann ich nicht widerstehen,
besser sowas aber gleich selber herausfinden, einfach loggen was passiert, wie sieht rep aus,
welche Blöcke werden abgespalten und verarbeitet usw.
 

sk72

Mitglied
Wie meinst du das mit der while-Schleife?
Folgender Ansatz funktioniert nämlich auch nicht richtig.

Java:
		if (rep.length() % 3 == 0)
		{
			int i = 0;
			while (i < rep.length())
			{
				String buffer = rep.substring(0, 3);
				
				if (buffer.equals("000"))
					str = str + "0";
				else if (buffer.equals("001"))
					str = str + "1";
				else if (buffer.equals("010"))
					str = str + "2";
				else if (buffer.equals("011"))
					str = str + "3";
				else if (buffer.equals("100"))
					str = str + "4";
				else if (buffer.equals("101"))
					str = str + "5";
				else if (buffer.equals("110"))
					str = str + "6";
				else if (buffer.equals("111"))
					str = str + "7";
				
				rep = rep.substring(3, rep.length());	
				i++;
			}
		}

Ist ja auch bloß eine äquivalente Schreibweise!? hmm :autsch:
 
S

SlaterB

Gast
ja, die ist genauso ungut, was interessiert dich i im Vergleich zu rep.length()?
die Schleife läuft, solange rep noch aufzuteilen ist, die Bedingung kannst du dir sicher denken,
i fällt komplett weg
 

sk72

Mitglied
Ja, alles klar ;)

Java:
while (rep.length() > 0)

Wobei auf die Weise unnötige 0'en zu Beginn gesetzt werden.
 

Jodo

Aktives Mitglied
Hi,

ich sehe gerade nicht, wieso da nun mehr (oder weniger) Nullen gesetzt werden sollen, du hast ja nur die Schleifenbedingung berichtigt, da sie davor zu oft durchgelaufen ist und nun abbricht wenn rep leer ist.

Ich empfehle dir mal den StringBuilder anzuschauen: StringBuilder (Java 2 Platform SE 5.0)
Damit hast du einen "dynamischen String". Strings selbst kannst du nicht verändern, d.h. für
Code:
rep = rep.substring(3, rep.length());
wird immer ein neues Stringobjekt im Speicher angelegt.

Mit dem StringBuilder kannst du in deinem Fall dann sauberer arbeiten. Schau dir dazu append(), insert() und delete() an; und natürlich wie bei Strings subString(), length() und toString() zur Ausgabe des StringBuilder Inhalts.

Gruß Jodo

-Edit-
Jetzt weiss ich, was du mit den Nullen meinst:oops:.
Bevor du str zurückgibst musst du einfach noch alle führenden Nullen entfernen. Oder du prüfst das beim Einfügen schon. Wenn die "0" die erste Zahl in str wäre, dann füge sie nicht ein.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Zahlenkonvertierung Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben