// Java example 1.
/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
public void print();
}
class Pair< T1, T2 >{
public T1 _first;
public T2 _second;
public Pair( T1 first, T2 second ){
_first = first;
_second = second;
}
} // End Pair.
interface One_D_Functional
extends Printable{ public double f( double d );
} // End One_D_Functional.
private double _lower_bound;
private double _upper_bound;
public Range( double lower, double upper ){
assert lower <= upper : " lower > upper!";
this._lower_bound = lower;
this._upper_bound = upper;
}
public double lower(){
return this._lower_bound;
}
public double upper(){
return this._upper_bound;
}
public void change_upper( double new_upper ){
this._upper_bound = new_upper;
}
public void change_lower( double new_lower ){
this._lower_bound = new_lower;
}
public void print(){
System.
out.
println("Range{ [ " + this._lower_bound
+ " ; " + this._upper_bound
+ " ] }"); }
} // End Range.
interface One_D_Piecewise_Functional extends One_D_Functional{
public Range get_Range();
public void add_Functional( One_D_Functional f, Range r );
} // End One_D_Piecewise_Functional.
class General_One_D_Piecewise_Functional implements One_D_Piecewise_Functional{
private int _size_of_list;
private List<Range> _Range_list;
private List<One_D_Functional> _func_list;
Pair< Range, One_D_Functional > _find( double x ){
ListIterator<Range> Range_Iter = _Range_list.listIterator();
ListIterator< One_D_Functional > func_Iter = _func_list.listIterator();
while ( Range_Iter.hasNext() ){
Range r = Range_Iter.next();
One_D_Functional func = func_Iter.next();
if( x <= r.upper() ){
Pair< Range, One_D_Functional > pair = new Pair< Range, One_D_Functional >( r, func );
// pair._first = r;
// pair._second = func;
return pair;
} // End if.
} // End while.
// Redundant code required to compile.
Pair< Range, One_D_Functional > pair = new Pair< Range, One_D_Functional >( _Range_list.get(0), _func_list.get(0) );
return pair;
} // End _find.
ListIterator< One_D_Functional > _find_func( double x ){
ListIterator<Range> Range_Iter = _Range_list.listIterator();
ListIterator< One_D_Functional > func_Iter = _func_list.listIterator();
while ( Range_Iter.hasNext() ){
Range r = Range_Iter.next();
One_D_Functional func = func_Iter.next();
if( x <= r.upper() ){
return func_Iter;
} // End if.
} // End while.
// Redundant code needed to compile.
return func_Iter;
} // End _find_func.
public General_One_D_Piecewise_Functional( Range r, One_D_Functional func){
this._Range_list = new ArrayList<Range>();
_Range_list.add( 0, r );
_func_list = new ArrayList<One_D_Functional>();
_func_list.add( 0, func );
_size_of_list = 1;
}
public Range get_Range(){
Range lower = this._Range_list.get(0);
Range upper = this._Range_list.get( _size_of_list-1 );
Range r = new Range( lower.lower(), upper.upper() );
return r;
}
public void add_Functional(One_D_Functional f, Range r){
assert _Range_list.get( _size_of_list - 1 ).upper() == r.lower() : "Can't extend with range.";
_Range_list.add( r );
_func_list.add( f );
_size_of_list++;
}
public double f( double x ){
assert x > _Range_list.get( _size_of_list - 1 ).upper() : "x is above range!";
assert x < _Range_list.get( 0 ).lower() : "x is below range!";
Pair< Range, One_D_Functional > pair = _find( x );
if( x == pair._first.upper() ){
// Need average of two functionals.
ListIterator< One_D_Functional > func_Iter = _find_func( x );
One_D_Functional f2 = func_Iter.next();
One_D_Functional f1 = func_Iter.previous();
f1 = func_Iter.previous();
return ( 0.5* ( f1.f(x) + f2.f(x) ) );
}
return pair._second.f( x );
}
public void print(){
System.
out.
println( "General_One_D_Piecewise_Functional{" ); ListIterator<Range> Range_Iter = _Range_list.listIterator();
ListIterator< One_D_Functional > func_Iter = _func_list.listIterator();
while( Range_Iter.hasNext() ){
Range r = Range_Iter.next();
One_D_Functional func = func_Iter.next();
r.print();
func.print();
} // End while.
System.
out.
println( "}General_One_D_Piecewise_Functional" );
}
} // End General_One_D_Piecewise_Functional.
class One_D_Const implements One_D_Functional{
private double d;
public One_D_Const( double d ){
this.d = d;
}
public double f( double d){
return this.d;
}
public void print( ){
System.
out.
println("One_D_Const{ " + this.
d + " }"); }
} // End One_D_Const.
// Main class with static main function.
class Main{
public static void main
(String args
[]){ One_D_Functional f = new One_D_Const( 12.3 );
f.print();
System.
out.
println("f( 15 ) = " + f.
f( 15 ) ); Range r = new Range( 0.0, 10.0 );
General_One_D_Piecewise_Functional gen_func = new General_One_D_Piecewise_Functional( r, f);
gen_func.print();
gen_func.f( 10.1 );
} // End Main.
} // End Main