Gibt es eine "Range" Klasse, mit der man sowas definieren kann: 1-5;8;12-20

yves030

Mitglied
Hi & happy new year,

gibt es irgendwo eine Klasse, mit der man Bereiche von int Werten definieren kann, ähnlich wie z.B. bei der
Druckausgabe, wo man "definiert", welche Seiten gedruckt werden sollen...
Nehmen wir an, ich habe ein 100seitiges Dokument und möchte nur die Seiten 1-5, die Seite 8 und die Seiten 12-20
drucken. Dann definiert man beim Druckdialog das ja auf folgende Weise: 1-5;8;12-20

D.h. ein Semikolon trennt einen Bereich und ein Bereich ist definiert von einer Unter- und Obergrenze.

Ich suche nun eine Klasse, mit der ich sowas nutzen kann:

RangeSet aRangeSet = new RangeSet("1-5;8;12-20");

Range aRange = aRangeSet.next();

aRange.getLowerValue() -> 1

aRange.getHigherValue() -> 5

etc...

Das zu implementieren wäre nicht schwer, aber warum das Rad neu erfinden... sowas wird es doch schon geben, nur
konnte ich nix passendes finden... hat jmd. sowas in seinem Schatzkistchen?
Falls ich nix höre, werde ich heute abend selber rangehen und das hier posten, bin aber für Links auf quelloffene Bibliotheken,
die sowas schon anbieten dankbar..

VG.,
Yves
 

sheel

I love Asm
Hi

hat jmd. sowas in seinem Schatzkistchen?
Allerdings :)
Die Frage ist nur, ob die Methodenzusammenstellung für deine Fälle so passt.
Irgendwo stehts auch hier im Forum online, suche den Link gerade...
Sonst einfach einmal sagen, was gebraucht wird.

edit: Hier drin, general/Range.java
http://www.tutorials.de/attachments/diskussion/62648d1380479964-quiz18.zip
Es ist nicht so schönklingend wie getLowerValue, getHigherValue usw.
(stattdessen getA und getB), aber funktionieren sollte es.

(und irgendeine Methode hat eine vergleichweise schlechte Laufzeit,
weil ich zu faul zum Bessermachen war. Funktioniert aber,
und für kleine Mengen macht es keinen Unterschied)
 

yves030

Mitglied
Moin,

Danke für den Link... es war nicht ganz so, wie ich es gesucht habe... anbei meine Lösung... sicher noch mit
Verbesserungspotential, aber für einen ersten schnellen Schuß reicht mir das vollkommen... es kam mir insbesondere
darauf an, dass man in einem String die Semikolon separierten Bereiche angeben kann...

Code:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;



public class RangePatternTest {


	public static void main(String[] args) {
		
		ArrayList<Range> aRangeSet = new ArrayList<Range>();

		String rangeExample =  "1-5;7;12-22;50-56;60-90;95;";
		String MultipleRangesRegEx = "(\\d+(-\\d+)?)"; 

		
		Pattern mrPattern = Pattern.compile(MultipleRangesRegEx);
		
		Matcher m = mrPattern.matcher(rangeExample);
		while (m.find()) {
			aRangeSet.add(new Range(m.group()));
			}

		// Ausgabe
		for(Iterator <Range> it = aRangeSet.iterator(); it.hasNext();)
			System.out.println(it.next().toString());
	}
	



static class Range{
	int lowerValue=0;
	int upperValue=0;

	public Range(String rangeAsText){
		String rangeRegEx = "(\\d+)(-)?(\\d+)?"; 
		Pattern rPattern = Pattern.compile(rangeRegEx);
		
		Matcher m = rPattern.matcher(rangeAsText);
		if (m.matches()){
			try{
				lowerValue=Integer.parseInt(m.group(1));
				upperValue=lowerValue;
			}
			catch (Exception e){}
			if (m.groupCount()==3)
			try{
				upperValue=Integer.parseInt(m.group(3));
			}
			catch (Exception e){}
			if (upperValue<lowerValue){
				int t=lowerValue;
				lowerValue = upperValue;
				upperValue = t;
			}
		}

	}

	public Range(int singleValue){
		this.lowerValue = singleValue;
		this.upperValue = singleValue;
	}

	public Range(int lowerValue, int upperValue){
		if (lowerValue<=upperValue){
			this.lowerValue = lowerValue;
			this.upperValue = upperValue;
		}
		else{
			this.lowerValue = upperValue;
			this.upperValue = lowerValue;
		}
	}
	public int getLowerValue(){
		return lowerValue;
	}
	public int getUpperValue(){
		return upperValue;
	}
	public String toString(){
		if (lowerValue==upperValue)
			return String.format("Ich bin ein Ein-Werte-Bereich mit dem Wert %d", lowerValue);
		return String.format("Ich bin ein Bereich von %d bis %d", lowerValue, upperValue);
	}
	
}

}


Führt man das dann aus, so kommt das hier raus:

Code:
Ich bin ein Bereich von 1 bis 5
Ich bin ein Ein-Werte-Bereich mit dem Wert 7
Ich bin ein Bereich von 12 bis 22
Ich bin ein Bereich von 50 bis 56
Ich bin ein Bereich von 60 bis 90
Ich bin ein Ein-Werte-Bereich mit dem Wert 95

VG.,
Yves