Umsortieren zweier Feldelemente

Mit diesem Codestückchen lassen sich zwei Feldelemente eines Arrays umsortieren:

	public void swap(int[] array, int idx1, int idx2) {
		int tmp = array[idx1];
		array[idx1] = array[idx2];
		array[idx2] = tmp;
	}

Das Element, dass sich hinter array[idx2] verbirgt ist kleiner als das Element hinter array[idx1]. Mit Hilfe der tmp Variable tauschen wir den Inhalt beider Felder.

Schick, oder?

Algorithmen und Datenstrukturen

Aktuell beschäftige ich mich mit Algorithmen, die Datenstrukturen bleiben noch ein wenig vor mir verschont, sind aber auch in Kürze dran.

Heute gab es gleich zwei interessante “Probleme” zu verstehen und zu implementieren, nämlich

  1. dem Sortieren von Daten
    dabei habe ich mich auf das Sortieren von Integer Arrays beschränkt, um erst mal zu verstehen wie das Ganze funktioniert und wie man überhaupt sortiert.
  2. dem Suchen von Daten
    auch hier bin ich den Integer Array treu geblieben, das ich zuerst mittels Math.random() mit Zahlen befüllt habe und anschließend Ordnung in Form einer aufsteigenden Sortierung da rein gebraucht hab, um es schließlich zu durchsuchen.

 
Die Methode zum Suchen

public String search(int[] array, int marker) {

		boolean found = true;
		int nOps = 0;
		int untereGrenze 	= 1;
		int obereGrenze		= array.length-1;

		String rc = null;

		do {

			int mitte = (untereGrenze+obereGrenze)/2;

			System.out.println("Mitte: " +array[mitte] + " gesucht: " + marker);

			if(array[mitte] == marker){

				++nOps;
				found = true;
				rc = "Es hat " + nOps + " Suchoperationen gebraucht um " + marker + " im Array zu finden.";
			}

			else if(nOps >= 20){
				found = true;
				rc = marker + " konnte leider nicht gefunden werden!";
			}

			else if(array[mitte] < marker){

				++nOps;
				untereGrenze = array[mitte+1];
				mitte 		= (untereGrenze+obereGrenze)/2;
				found = false;
			}
			else if(array[mitte] > marker){

				++nOps;
				obereGrenze = array[mitte-1];
				mitte = (untereGrenze+obereGrenze)/2;
				found = false;
			}

		}while(!found);

		return rc;
	}

Ich freue mich natürlich über jeden Kommentar und falls es etwas zum Verbessern gibt, wovon ich ausgehe, bin ich natürlich für jeden Tipp dankbar. Ich lerne gern und viel und gern auch dazu!
Also rein hauen!

jBPM starten

Nachdem wir nun unsere Demo installiert haben, wollen wir gern mal rein schauen, was uns das Programm so an Möglichkeiten bietet.

Gestartet wird das Ganze so:

ant start.demo

es werden nun folgende Komponenten gestartet:

	die H2 Datenbank
	der JBoss Application Server
	Eclipse
	jBPM

Jetzt kann man mit Eclipse oder über die jBPM Konsole arbeiten. Wie das genau geht, wird in einem weiteren Artikel in den nächsten Tagen veröffentlicht.

jBPM installieren

Bevor jBoss jBPM installiert werden kann, musst du es erst einmal herunterladen, hinter diesem Link hier kannst du jBPM downloaden.

Kurz noch zur Lizenz:

  • der jBPM Sourcecode steht unter Apache License 2.0
  • Eclipse BPMN2 Plugin unter Eclipse Public License (EPL) v1.0.
  • Web-basierter Designer unter Oryx/Wapama and is MIT License
  • BPM Konsole unter GNU Lesser General Public License (LGPL) v2.1
  • das Drools Projekt steht unter Apache License v2.0.

Nun muss überprüft werden, ob folgende Software bereits auf dem Rechner installiert ist:

  1. Java mindestens V 1.5 und in der Path Variable bekannt sein
  2. Ant mindestens V 1.7

Dann kann es auch schon los gehen.

Du öffnest ein Terminalfenster, wechselst in das Verzeichnis, in dem du jBPM entpackt hast. Durch Eingabe von ant install.demo startest du die Installation.
Es werden jede Menge Dateien aus dem Internet nachgeladen, der Installer informiert dich aktuell, welche Datei gerade verarbeitet wird. Es dauert aber eine ganze Weile, es muss viel runtergeladen werden, im Einzelnen sind das folgende Komponenten:

  • JBoss Application Server
  • Eclipse
  • Drools Guvnor im JBoss AS
  • Oryx Designer im JBoss AS
  • die jBPM Konsole für den JBoss AS
  • Installation des jBPM Eclipse Plugin
  • Installation des Drools Eclipse Plugin

Ein kleiner Auschnitt der Installation:

Buildfile: /home/ottp/Downloads/jbpm-installer/build.xml

download.jboss.check:
     [echo] Checking JBoss AS download ...

download.jboss:

install.jboss:
    [unzip] Expanding: /home/ottp/Downloads/jbpm-installer/lib/jboss-as-7.0.2.Final.zip into /home/ottp/Downloads/jbpm-installer

download.drools.guvnor.check:
     [echo] Checking Drools Guvnor download ...

download.drools.guvnor:

check.jboss.version:

install.guvnor.into.jboss:
     [copy] Copying 1 file to /home/ottp/Downloads/jbpm-installer/jboss-as-7.0.2.Final/standalone/deployments

download.designer.check:
     [echo] Checking Designer download ...

download.designer:

install.designer.into.jboss:
     [copy] Copying 1 file to /home/ottp/Downloads/jbpm-installer/jboss-as-7.0.2.Final/standalone/deployments

check.jboss.version:

created.designer.deployment.as7:
    [touch] Creating /home/ottp/Downloads/jbpm-installer/jboss-as-7.0.2.Final/standalone/deployments/designer.war.dodeploy

download.h2.check:
     [echo] Checking h2 download ...

download.h2:
     [echo] Getting h2 ...
      [get] Getting: http://repo1.maven.org/maven2/com/h2database/h2/1.2.124/h2-1.2.124.jar
      [get] To: /home/ottp/Downloads/jbpm-installer/db/driver/h2.jar

download.jBPM.gwt-console.check:
     [echo] Checking jBPM gwt-console download ...

download.jBPM.gwt-console:

install.jBPM-gwt-console.into.jboss:

check.jboss.version:

install.jBPM-gwt-console.into.jboss5:

check.jboss.version:

install.jBPM-gwt-console.into.jboss7:

check.birt.as7:

download.birt.check.as7:
     [echo] Checking birt reporting engine download for as7 ...

download.birt.as7:
    [mkdir] Created dir: /home/ottp/Downloads/jbpm-installer/target
    [unzip] Expanding: /home/ottp/Downloads/jbpm-installer/lib/jbpm-5.2.0.Final-gwt-console.zip into /home/ottp/Downloads/jbpm-installer/target
    [mkdir] Created dir: /home/ottp/Downloads/jbpm-installer/target/jbpm-gwt-console-server-war
    [unzip] Expanding: /home/ottp/Downloads/jbpm-installer/target/jbpm-gwt-console-server-5.2.0.Final.war into /home/ottp/Downloads/jbpm-installer/target/jbpm-gwt-console-server-war
     [copy] Copying 1 file to /home/ottp/Downloads/jbpm-installer/target/jbpm-gwt-console-server-war/WEB-INF/classes
     [copy] Copying 1 file to /home/ottp/Downloads/jbpm-installer/target/jbpm-gwt-console-server-war/WEB-INF/classes/META-INF
     [copy] Copying 1 file to /home/ottp/Downloads/jbpm-installer/target/jbpm-gwt-console-server-war/WEB-INF/classes
     [copy] Copying 1 file to /home/ottp/Downloads/jbpm-installer/target/jbpm-gwt-console-server-war/WEB-INF/classes
     [copy] Copying 1 file to /home/ottp/Downloads/jbpm-installer/target/jbpm-gwt-console-server-war/WEB-INF/lib
     [copy] Copying 2 files to /home/ottp/Downloads/jbpm-installer/target/jbpm-gwt-console-server-war/WEB-INF/lib
     [copy] Copying 3 files to /home/ottp/Downloads/jbpm-installer/target/jbpm-gwt-console-server-war/WEB-INF/classes

check.birt.as7:

install.reporting.into.jboss7:
    [mkdir] Created dir: /home/ottp/Downloads/jbpm-installer/birt

Ich habe die gesamte Installation mal in eine TXT Datei umgeleitet und an diesen Artikel angehängt, wer sich also den ganzen Installationsprozess mal anschauen möchte, kann das install_jBPM File gern downloaden.

 

jBPM – Business Process Management

Hallo zusammen,

ich habe ein interessantes Projekt jBPM beim WIkipedia lesen gefunden, mit dem man die Geschäftsprozesse abbilden kann, Ziele formulieren und den Weg, der zu gehen ist, um diese Ziele zu erreichen, verfolgen.

Damit lassen sich Probleme im Ablauf der Betriebsabläufe entdecken und gegebenenfalls zu optimieren.

jBPM betrachtet Geschäftsprozesse aus zwei Perspektiven

  1. aus Sicht der Analysten
  2. aus Sicht der Entwickler

und nicht, wie andere Produkte, nur aus einer nicht technischen Sicht.

Website besuchen und Doku lesen lohnt sich in jedem Fall!

Viel Spaß!

Applikation zur Konferenzraumbuchung

Die heutige Klausuraufgabe hab ich dann gleich mal in Eclipse umgesetzt und eben erst mal alles aufgeschrieben, was mir noch im Kopf gewesen ist. In der Klausur musste mit dokumentenechtem Stift auf Papier programmiert werden.

So, hier nun mein Ansatz:

Das Interface zusKosten.java

package KonferenzRaum;

public interface zusKosten {

	public double zusKosten();

}

Die Klasse zusAust.java – für eventuelle Zusatzausstattung (z.B. Beamer)

package KonferenzRaum;

public class zusAust
implements zusKosten
{
	private String name;
	private double preis;

	public zusAust(String name, double preis)
	{
		this.name	= name;
		this.preis	= preis;
	}

	@Override
	public double zusKosten() {

		return preis;
	}

	public String toString()
	{
		return name + " " + preis + "EUR/Tag";
	}

}

Die Klasse zusCate.java – ein Catering-Service

/*
 * Catering Klasse, falls zum Konferenz-Raum noch ein
 * Catering-Paket gebucht wird.
 */
package KonferenzRaum;

public class zusCate
implements zusKosten
{

	private String name;
	private int anzahlPers;
	private double preisProPers;

	public zusCate(String name, int anzahl, double preis)
	{
		this.name			= name;
		this.anzahlPers		= anzahl;
		this.preisProPers	= preis;
	}
	@Override
	public double zusKosten() {

		return this.anzahlPers*this.preisProPers;
	}

	public String toString()
	{
		return "Catering-Menü: " + name + " für " + this.anzahlPers + " Personen\n" +
				"Kosten pro Person: " + this.preisProPers;
	}

}

die Klasse KonfRaum.java, von der wird nämlich geerbt:

package KonferenzRaum;

public class KonfRaum {

	protected int plätze;
	protected String name;
	protected double preis;

	public KonfRaum(String name, int p, double preis)
	{
		this.name	= name;
		this.plätze	= p;
		this.preis	= preis;
	}

	public double getPreis()
	{
		return this.preis;
	}

	public String toString()
	{
		return name + " " + preis + "EUR";
	}
}

und last but not least, die Klasse KonfRaumBuchung.java, um nun das Objekt zu erzeugen und die Berechung durch zu führen:

/*
 * Catering Klasse, falls zum Konferenz-Raum noch ein
 * Catering-Paket gebucht wird.
 */
package KonferenzRaum;

public class zusCate
implements zusKosten
{

	private String name;
	private int anzahlPers;
	private double preisProPers;

	public zusCate(String name, int anzahl, double preis)
	{
		this.name			= name;
		this.anzahlPers		= anzahl;
		this.preisProPers	= preis;
	}
	@Override
	public double zusKosten() {

		return this.anzahlPers*this.preisProPers;
	}

	public String toString()
	{
		return "Catering-Menü: " + name + " für " + this.anzahlPers + " Personen\n" +
				"Kosten pro Person: " + this.preisProPers;
	}

}

Was noch fehlt ist das Array, das erstellt und mit den Zusatzausstattungen gefüllt werden sollte. Das liefere ich noch.
Ich gebe keine Garantie auf Vollständigkeit oder Richtigkeit, das soll nur als kleiner Anhalt dienen und hoffentlich für Diskussionsstoff sorgen.

Also, Feuer frei!

PI Berechnung

Hallo zusammen, ich habe mal wieder ein kleines Programm für den aufmerksamen Leser. Diesmal versuche ich mittels eines Java-Programms die Zahl PI näherungsweise zu bestimmen.

import java.io.*;
public class Pi {

	static BufferedReader br = new BufferedReader(
			new InputStreamReader(System.in));
	public static void main(String[] args)
	throws IOException
	{

		System.out.println("Bitte geben Sie die Anzahl ein: ");
		int n = Integer.parseInt(br.readLine());
		double pi = 0;

		for(int i = 0; i < n; ++i)
		{
			if(i % 2 == 0)
			{
				pi += (1.0 / (2*i+1));
			}
			else
			{
				pi -= (1.0 / (2*i+1));
			}
		}

		System.out.println((4*pi) + " " + pi);
	}

}

Viel Spaß damit.

Rekursion – Einen String rückwärts ausgeben

Hilfe! Das böse Wort! Rekursion :-)

So wild ist das gar nicht, denn die Rekursion lässt sich optimal bei Problemen einsetzen, die eine gewisse Laufzeit haben, d.h. so ziemlich alles, was sich mit einer FOR-Schleife lösen lässt, kann ich auch rekursiv lösen.

Rekursiv heißt eigentlich nichts anderes, als das sich eine Methode bis zu einer gewissen Abbruchbedingung immer wieder selbst aufruft, bis eine Abbruchbedingung erreicht wird.

Als Beispiel habe ich einen String, der rückwärts ausgegeben werden soll.

	public static void rkw(String s)
	{
		if(s.length() > 0)
		{
			System.out.print(s.charAt(s.length()-1));
			rkw(s.substring(0, s.length()-1));
		}

Die Methode rkw erwartet als Übergabeparameter einen String. Wird dieser übergeben, überprüft rkw zuerst, ob die Länge größer 0 ist, wenn ja, dann wird die letzte Stelle des Strings mit System.out.print() ausgegeben.
Anschließend rufen wir rkw erneut auf, diesmal aber mit dem veränderten String s, dieser hat nämlich nun nur noch eine Länge von 0 bis Ende-1, d.h. es wird am Ende einfach das letzte Zeichen “abgeschnitten”. Das machen wir solange, bis der String komplett umgekehrt wurde, dann ist die Abbruchbedingung erreicht und wir verlassen die Methode wieder und das kleine Programm wird beendet.

Hier folgt der gesamte Quelltext:


public class rückwärts {

	public static void rkw(String s)
	{
		if(s.length() > 0)
		{
			System.out.print(s.charAt(s.length()-1));
			rkw(s.substring(0, s.length()-1));
		}

	}
	public static void main(String[] args) {

		String s = "Das ist ein String!";

		System.out.println(s);
		rkw(s);

	}

}

Ausgabe:

Das ist ein String!
!gnirtS nie tsi saD

Beispiele für Methoden der Klasse String

Hier nur ein wirklich sehr leichtes Beispiel für die Methoden, die uns die Klasse String zur Verfügung stellt.

Bei Gelegenheit werde ich dazu noch ein ausführlicheres Beispiel präsentieren.

import java.io.*;
public class Zeichenketten {

	static BufferedReader br = new BufferedReader(
			new InputStreamReader(System.in));

	public static void main(String[] args)
	throws IOException
	{
		String vorname, name;

		System.out.println("Bitte geben Sie Ihren Vornamen ein: ");
		vorname = br.readLine();
		System.out.println("Bitte geben Sie Ihren Nachnamen ein: ");
		name 	= br.readLine();

		System.out.println("--------------------------------------------------------------");
		System.out.println("Einige Beispiele, was man mit Zeichenketten/Strings machen kann:");
		System.out.println("--------------------------------------------------------------");

		System.out.println("vollständige Ausgabe: " + vorname + " " + name);
		System.out.println("V. Name: " + vorname.charAt(0) +". " + name);
		System.out.println("Vorname N.: " + vorname +". " + name.charAt(0));
		System.out.println("V. N.: " + vorname.charAt(0) +". " + name.charAt(0) + ".");
		System.out.println("erster Buchstabe Vorname fehlt:" + vorname.substring(1));
		System.out.println("erster Buchstabe Nachname fehlt:" + name.substring(1));

	}

}

Viel Spaß beim Modifizieren und Ausprobieren!