Ranges

Hi,

I'm looking for a way to keep ranges. I have objects which have an effect over a certain time interval. Some objects' effects may overlap others. I need a way of adding objects and their ranges and then asking for all resulting intervals.

For example, if I have:

add(A, 2, 10)

add(B, 3, 7)

Then I can get:

A 2-3

B 3-7

A 7-10

Anyone has an idea how this can be implemented (or better yet - has a class that does this)?

Thanks,

Zohar.

[511 byte] By [zohar.amira] at [2007-11-27 10:50:13]
# 1

I have no idea what you're asking.

However, whatever you're trying to do, first figure out in precise detail how you'd do it "by hand." If you can explain that clearly and precisely, then translating it do Java should be easy.

jverda at 2007-7-29 11:23:59 > top of Java-index,Core,Core APIs...
# 2

Here's an idea:

public class Range<V> {

Map<Integer, Stack<V>> map;

public Range() {

map = new TreeMap<Integer, Stack<V>>();

}

public void addRange(V value, int min, int max) {

// loop 'i' from 'min' to 'max'

//if 'i' is already in 'map'

//get the stack associated with 'i' and push 'value' on it

//else

//create a new stack, pusk 'i' on it and put it in the 'map'

//end if

// end loop

}

public String toString() {

// your code

}

public static void main(String[] args) {

Range<Character> range = new Range<Character>();

range.addRange('A', 2, 10);

range.addRange('B', 3, 7);

System.out.println(range);

}

}

You now only need to traverse over your keys and peek() from all the stacks to see your ranges.

prometheuzza at 2007-7-29 11:23:59 > top of Java-index,Core,Core APIs...
# 3

Hi,

I have developed a sample code snippet for the above requirement. I have attached the code also.

import java.util.ArrayList;

import java.util.HashSet;

import java.util.Iterator;

import java.util.List;

import java.util.Set;

public final class RangeData {

List rangeList;

Set uniqueRangeSet;

/**

* default constructor

*

*/

public RangeData() {

rangeList = new ArrayList();

uniqueRangeSet = new HashSet();

}

public void add(String data, int minRange, int maxRange) {

this.putInRange(data,minRange,maxRange);

}

private void putInRange(String data, int minRange, int maxRange) {

/*System.out.println(" data ==> " + data);

System.out.println(" minrange ==> " + minRange);

System.out.println(" maxrange ==> " + maxRange);*/

Range range = new Range(data, minRange, maxRange);

rangeList.add(range);

uniqueRangeSet.add(new Integer(minRange));

uniqueRangeSet.add(new Integer(maxRange));

}

public List getAllRanges() {

List pullRangeList = new ArrayList();

Integer[] rangeArray = new Integer[uniqueRangeSet.size()];

uniqueRangeSet.toArray(rangeArray);

int startRange = -1;

int endRange = -1;

startRange = (rangeArray.length > 1)?rangeArray[0]:-1;

for(int i = 1; i < rangeArray.length; i++) {

endRange = rangeArray[i];

//process all the things

//set the endRange to the startRange

pullRangeList.addAll(getDatasInRange(startRange, endRange));

startRange = endRange;

}

return pullRangeList;

}

private List getDatasInRange(int startRange, int endRange) {

List returnValue = new ArrayList();

Iterator rangeListIterator = rangeList.iterator();

while(rangeListIterator.hasNext()) {

Range range = (Range) rangeListIterator.next();

if(startRange >= range.minRange && endRange <= range.maxRange) {

returnValue.add("(" + range.data + ", " + startRange + ", " + endRange + " )");

}

}

return returnValue;

}

private class Range {

private String data;

private int minRange;

private int maxRange;

private Range() {

//default constructor[not to use]

}

public Range(String data, int minRange, int maxRange) {

this.data = data;

this.minRange = minRange;

this.maxRange = maxRange;

}

}

}

The test program is follows :

import java.util.Iterator;

import java.util.List;

public class RangeTest {

/**

* @param args

* loganathank

* void

*

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

System.out.println("GOD IS GREAT !!!");

RangeData rangeData = new RangeData();

rangeData.add("a",2,10);

rangeData.add("b",3,7);

List rangeDataList = rangeData.getAllRanges();

Iterator rangeDataListIterator = rangeDataList.iterator();

while(rangeDataListIterator.hasNext()) {

System.out.println(rangeDataListIterator.next());

}

}

}

Please let me know your comments.

Regards,

Loga

Loga_07a at 2007-7-29 11:23:59 > top of Java-index,Core,Core APIs...