Methoden Lauflängencodierung Rückwärts!

Rayo

Mitglied
Hallo ich beschäftige mich gerade mit der Dekomprimierung von Strings. Dabei versuche ich gerade eine Methode zu schreiben "extend(String s)", die mir ein String auf folgender Art erweitert:

2A. = AA
32DU.. = 2DU.2DU.2DU. = DUDUDUDUDUDU

Der Befehl: "nBefehlsfolge." mit n = (1 <= n <= 9) führt den Befehl n mal aus.
Aber irgendwie schaffe ich das gerade nicht, es war doch schwerer, als ich es mir dachte. Könnte einer von euch so ein Programm schreiben?
 

Gucky

Top Contributor
Und ob das jemand kann. In der Jobbörse gegen Lohn. :D

Dieses Forum ist nicht dazu da den Code anderer Leute zu schreiben, sondern um Leuten mit Problemen zu helfen und zusammen mit ihnen die Lösung(en) zu erarbeiten.
Wenn du also diesen Code brauchst, dann musst du entweder selbst Hand anlegen oder jemanden dafüf bezahlen. :D
 

Natac

Bekanntes Mitglied
Wie würdest du denn vorgehen? Bzw. wie geht du vor, wenn du es "per Hand" machst?

Folgende grobe Struktur scheint mir sinnvoll
1. Zahl bestimmen (die nächste Zahl, wie oft der String danach wiederholt werden soll)
2. String entsprechend oft wiederholen.
3. Von Vorne anfangen, solange bis es keine Zahlen mehr im String gibt.

Diese "Liste" kannst du nun um weitere Punkte ergänzen und um Unterpunkte erweitern. Irgendwann hättest du dann Pseudo-Code, den du in Java umsetzen kannst.

Nur Mut, ich denke nicht, das diese Aufgabe für dich unlösbar ist.
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
Hast du es denn schonmal einfach mit einer For schleife versucht ?

z.B

PSEUDO-CODE
Java:
String s = "DU";

ich bin eine funktion(){

int zahl=0;

für(zahl;zahl<s.länge;zahl++){
  
   gebe aus (s); 

}

Die Schleife iteriert über die länge des von dir angegebenen Strings , in dem Fall hat der String n=2 Buchstaben, und gibt deinen String n(2) mal aus.

Ergäbe folgende Ausgabe

Code:
DUDU
da "s" aus 2 Buschstaben besteht, wenn "s" jetzt z.B den Wert ABABAB (n6) hat wäre die ausgabe

Code:
ABABABABABABABABABABABABABABABABABAB
 
Zuletzt bearbeitet:

Rayo

Mitglied
Mein Problem liegt darin zu schreiben, wie weit die Befehlsfolge geht, da es verschachtelte und in der Reihe liegende Befehlsfolgen gibt. In meinem Code sind nur die Zeichen "FWlr-" erlaubt. Das hier ist mein momentaner Code:

Code:
public static String extend(String in)
    {
    	List<Object> Characters = new ArrayList<Object>();
        List<Integer> Positions = new ArrayList<Integer>();
        int numbers = 0; int points = 0;
        String extendProgram = "";
        
        // Find Numbers and Points
        for(int i = 0; i < in.length(); i++)
        {
            if ((in.charAt(i) == '1') || (in.charAt(i) == '2') || (in.charAt(i) == '3') ||
            	(in.charAt(i) == '4') || (in.charAt(i) == '5') || (in.charAt(i) == '6') ||
                (in.charAt(i) == '7') || (in.charAt(i) == '8') || (in.charAt(i) == '9') ||
                (in.charAt(i) == '.'))
            {
            	if (in.charAt(i) == '.') { Characters.add('.'); points += 1; }
            	else                     { Characters.add(in.charAt(i)-48); numbers += 1; }
            	
            	Positions.add(i+1);
            }
        }
        
        // Extend the places between Numbers and Points
        if (numbers == points && Characters.get(0) != ".")
        {
        	int pointPosition = 0;
        	
        	for (int j = 0; j < Characters.size();)
        	{
        		if (j > 0) j -= 1;
        		
        		// Extend Program
        		for (int i = j; i < Characters.size()-1; i++)
        		{
        			if (!Characters.get(i+1).equals('.'))
        			{
        				pointPosition += 1;
        			}
        			else
        			{
        				break;
        			}
			}
        		
        		if (pointPosition == 0) pointPosition = 1;
        		
        		for (int i = 0; i < (int) Characters.get(j); i++)
        		{
        		    extendProgram = extendProgram + in.substring(Positions.get(j), Positions.get(j+pointPosition));
        		}

        		try
        		{
        	            j += (int) Characters.get(pointPosition+1);
			}
        		catch (Exception e)
			{
			    break;
			}
                }
        	
        	// If there are still numbers: Recursion
        	String s = extendProgram;
        	
        	for(int i = 0; i < s.length(); i++)
        	{
        	    if ((s.charAt(i) == '1') || (s.charAt(i) == '2') || (s.charAt(i) == '3') ||
                    (s.charAt(i) == '4') || (s.charAt(i) == '5') || (s.charAt(i) == '6') ||
                    (s.charAt(i) == '7') || (s.charAt(i) == '8') || (s.charAt(i) == '9'))
                    {
                        extend(extendProgram);
                    }
        	}
        	
        	// Remove Points from String
        	String newProgram = extendProgram.replaceAll("[.]", "");
        	
        	// Return new Program
        	Globals.ProgramCorrect = true;
        	return newProgram;
        }
        else
        {
        	Globals.ProgramCorrect = false;
        	return "Falsches Programm!";
        }
    }
 
Zuletzt bearbeitet:

Rayo

Mitglied
Oh, habs doch selber hingekriegt, naja jetzt hat sich die Sache erledigt.

Code:
public static String extend(String in)
    {
    	// Initialize Objects
    	List<String> Characters = new ArrayList<String>();
        List<Integer> Positions = new ArrayList<Integer>();
        String extendProgram = in, newProgram = "", program = "";
        int position = 0;
    	
    	do
    	{
    	    Characters.clear();
            Positions.clear();
            
            // Find Numbers and Points
    	    for(int i = 0; i < extendProgram.length(); i++)
            {
                if (extendProgram.substring(i,i+1).matches("[1-9]+") || extendProgram.charAt(i) == '.')
                {
                    if (extendProgram.charAt(i) == '.') Characters.add(".");
                    else                                Characters.add("" + (extendProgram.charAt(i)-48));
                	
                    Positions.add(i+1);
                }
            }
    	    
    	    // Find if there are numbers next to each other
    	    for (int i = 0; i < Characters.size()-1; i++)
            {
            	if (((String) Characters.get(i+1)).matches("[1-9]+")) position += 1;
            	else break;
            }
    	    
    	    // Extend the places between Numbers and Points
    	    if (Characters.size() > 0)
    	    {
    		program = extendProgram.substring(Positions.get(0)-1, extendProgram.length());
    		
    		for (int i = 0; i < Integer.parseInt(Characters.get(0)); i++)
    		{
    	            newProgram = newProgram + program.substring(1, Positions.get(position+1)-Positions.get(0)+position);
    		}
    		
    		newProgram = extendProgram.substring(0, Positions.get(0)-1) + newProgram;
    		extendProgram = newProgram + extendProgram.substring(Positions.get(position+1), extendProgram.length()-position);
                newProgram = ""; position = 0;
    	    }
	}
    	while (Characters.size() > 0);
    	
        return extendProgram;
    }
 

Ähnliche Java Themen

Neue Themen


Oben