ZeichenRuns komprimieren

Lybrial

Bekanntes Mitglied
Heyho,

ich versuche mich derzeit an einer sehr primitiven Datenkomprimierung ;)
Und zwar möchte ich mehrmals hintereinander vorkommende Zeichen
codieren um Speicherplatz zu sparen.

Derzeit habe ich 2 Klassen und eine TestKlasse geschrieben.
Die erste Klasse durchläuft einen String und testet, ob das
aktuelle gespeicherte Zeichen, gleich dem Zeichen an der
Stelle "i" des Strings ist. Wenn ja, soll die Stelle, das Zeichen
und die Anzahl der gleichen Zeichen gespeichert werden.
Dies bekomme ich auch wunderbar hin, nur logischerweise gibt
er mir bei dem derzeitigen Stand des Codes immer nur den letzten
Runs des Strings aus, d. h.:

BeispielString: aaabbbbbccc

Hier sollte er mir ausgeben :
1 3 a
4 5 b
9 3 c

aber wie gesagt gibt er mir hier ja erst 9 3 c aus, das liegt daran,
dass ich bisher noch auf keine Idee gekommen bin, wie ich die
vorherigen Runs auch abspeichern und ausgeben kann.

In der Klasse 2 werde ich sobald die erste Klasse funktioniert,
die Zeichen convertieren.

Class Run.java:
Java:
public class Run{
	private String mZeichenkette;
	private int mStelle, mRunLength, mAnzahlGleich;
	private char mZeichenAktuell = ' ';
	
	//*****Konstruktor***********************
	public Run(String aZeichenkette){
		this.setZeichenkette(aZeichenkette);
	}
	//*****************************************************************************************************************************************
	public void getRun(){
		this.setRunLength(this.getZeichenkette().length());

			for(int i = 0; i < this.getRunLength(); i++){
				if(this.getZeichenAktuell() != this.getZeichenkette().charAt(i)){
					this.setZeichenAktuell(this.getZeichenkette().charAt(i));
					this.setAnzahlGleich(0);
				}
				this.setAnzahlGleich(this.getAnzahlGleich()+1);
				this.setStelle(i - this.getAnzahlGleich()+2);
				
				//String aString = new String();
				//aString = aString + this.getZeichenAktuell() + this.getAnzahlGleich();
				//System.out.println(aString);
			}
	}
	//*****************************************************************************************************************************************
	private String getZeichenkette(){
		return mZeichenkette;
	}
	//*****************************************************************************************************************************************
	private void setZeichenkette(String aZeichenkette){
		mZeichenkette = aZeichenkette;
	}
	//*****************************************************************************************************************************************
	public int getStelle(){
		return mStelle;
	}
	//*****************************************************************************************************************************************
	private void setStelle(int aStelle){
		this.mStelle = aStelle;
	}
	//*****************************************************************************************************************************************
	public int getRunLength(){
		return mRunLength;
	}
	//*****************************************************************************************************************************************
	private void setRunLength(int aRunLength){
		this.mRunLength = aRunLength;
	}
	//*****************************************************************************************************************************************
	public int getAnzahlGleich(){
		return mAnzahlGleich;
	}
	//*****************************************************************************************************************************************
	private void setAnzahlGleich(int aAnzahlGleich){
		this.mAnzahlGleich = aAnzahlGleich;
	}
	//*****************************************************************************************************************************************
	public char getZeichenAktuell(){
		return mZeichenAktuell;
	}
	//*****************************************************************************************************************************************
	private void setZeichenAktuell(char aZeichenAktuell){
		this.mZeichenAktuell = aZeichenAktuell;
	}
	//*****************************************************************************************************************************************
}

Class Compression.java
Java:
import java.util.Scanner;

public class Compression {
	Scanner input = new Scanner(System.in);

	//*****Konstruktor***********************
	public Compression(){}
	//*****************************************************************************************************************************************
	public void getInfos(){
		System.out.print("Bitte eine Zeichenfolge eingeben: ");
		String aString = input.nextLine();
		
		Run run = new Run(aString);

		run.getRun();
		int start = run.getStelle();
		int folge = run.getAnzahlGleich();
		char zeichen = run.getZeichenAktuell();
		System.out.println(start+ " " +folge+ " " +zeichen);
	}
	//*****************************************************************************************************************************************
}

Class RunTest.java
Java:
public class RunTest{
	public static void main(String[] args){
		
		Compression comp = new Compression();
		comp.getInfos();
		
	}
}

Jemand ne Idee?^^
 
B

bone2

Gast
naja du gibst den string rein, udn während er den durchgeht speicherst du den fortschritt am besten in einem stringbuilder. also einfach immer speichern sobald ein neues zeichen auftaucht. dann gibts du den stringbuilder.toString() wieder an die main zurück.

Java:
    static public void main(String [] args) {
        mZeichenkette = "aaaabbbbccc";
        System.out.println((new Test()).getRun());
    }
    
    public String getRun(){
        mRunLength = mZeichenkette.length();
        StringBuilder ergebnis = new StringBuilder();
        
        for(int i = 0; i < mRunLength; i++){
            if(mZeichenAktuell != mZeichenkette.charAt(i)){
                if (i > 0) {
                    ergebnis.append(String.valueOf(startZahl) + String.valueOf(mAnzahlGleich) + String.valueOf(mZeichenAktuell));
                }
                
                mZeichenAktuell = mZeichenkette.charAt(i);
                mAnzahlGleich = 0;
                startZahl = i;
            }
            mAnzahlGleich++;
            
            //aString = aString + this.getZeichenAktuell() + this.getAnzahlGleich();
            //System.out.println(aString);
        }
        ergebnis.append(String.valueOf(startZahl) + String.valueOf(mAnzahlGleich) + String.valueOf(mZeichenAktuell));
        
        return ergebnis.toString();
    }

du musst das dann bei dir nach vorne durchreichen, den String, also aus run in info und aus info in main. lass die ganzen this weg um auf lokale variablen zuzugreifen. überhaupt ist es mit membervariablen nciht gut gelöst, warum braucsht du da soviele getter und setter?
 
Zuletzt bearbeitet von einem Moderator:

Lybrial

Bekanntes Mitglied
So viele getter und setter?

Mein Prof (Studiengang Informatik Semester 1) besteht darauf das wir alle
Membervariablen über getter und setter aufrufen....so ganz hab ich net
verstanden warum er darauf besteht^^

Aber die getter getStelle(), getZeichenAktuell() und getAnzahlGleich() brauch ich
ja sowieso, weil ich die ja in der anderen Klasse weiterverarbeiten möchte.
 
B

bone2

Gast
hm dann benutz keine membervariablen^^ die sind in deinem beispiel, wenn nicht explizit vom prof gefordert, überflüssig

aber wenn du member hast, klassenintern niemals getter/setter sondern static direkt aufrufen
 

Ähnliche Java Themen

Neue Themen


Oben