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.
# 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.
# 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