/**
* Binary Search List
*/
function testSortedList(){
alert("SortedList test begin:");
try{
var list=new ArrayList();
var s=new SortedList();
s.add(new JavaString("WSG"));
assert(s.size()==1);
assert(s.indexOf(new JavaString("WSG"))==0);
list.add(new JavaString("HELLO"));
list.add(new JavaString("TOM"));
list.add(new JavaString("BUSH"));
s.add(new JavaString("SINA"));
s.add(new JavaString("163"));
s.add(new JavaString("CSDN"));
s.addAll(list);
assert(s.size()==7);
assert(s.indexOf(new JavaString("SINA"))==4);
assert(s.indexOf(new JavaString("SSN"))==5);
assert(s.indexOf(new JavaString("SA"))==4);
//var s2=s.subList(4,7);
for(var i=0;i<s.size();i++){
alert(s.get(i));
}
}
catch(e){
alert(e);
}
alert("SortedList test end");
}
function SortedList(){
private:
this.buffer =new Array();
var args=SortedList.arguments;
if(args.length>0) this.buffer=args[0];
this.length=this.buffer.length;
com=null;
function ListIterator(table,len){
this.table=table;
this.len=len;
this.index=0;
this.hasNext=hasNext;
function hasNext() {
return this.index< this.len;
}
this.next=next;
function next() {
if(!this.hasNext())
throw "No such Element!";
return this.table[this.index++];
}
}
public:
this.setComparator=setComparator;
function setComparator(comp){
if(this.length!=0) throw "Only can be set when list is empty";
this.com=comp;
}
this.getComparator=getComparator;
function getComparator(){
return this.com;
}
this.hashCode=hashCode;
function hashCode(){
var h=0;
for(var i=0;i<this.length;i++)
h+=this.buffer[i].hashCode();
return h;
}
this.size=size;
function size(){
return this.length;
}
this.clear=clear;
function clear(){
this.length=0;
}
this.isEmpty=isEmpty;
function isEmpty(){
return this.length==0;
}
this.toArray=toArray;
function toArray(){
var copy=new Array();
for(var i=0;i<this.length;i++){
copy[i]=this.buffer[i];
}
return copy;
}
this.get=get;
function get(index){
if(index>=0 && index<this.length)
return this.buffer[index];
return null;
}
this.remove=remove;
function remove(param){
var index=0;
if(isNaN(param)){
index=this.indexOf(param);
}
else index=param;
if(index>=0 && index<this.length){
for(var i=index;i<this.length-1;i++)
this.buffer[i]=this.buffer[i+1];
this.length--;
return true;
}
else return false;
}
this.add=add;
function add(obj){
var index = this.indexOf(obj);
for(var i=this.length;i>index;){
this.buffer[i]=this.buffer[--i];
}
this.buffer[index]=obj;
this.length++;
}
this.indexOf=indexOf;
function indexOf(obj){
if(this.length==0) return 0;
var min=0,max=this.length-1;
var mid=0;
while(min<=max){
mid = (min+max) >> 1;
var c=0;
if(this.com==null) c=obj.compareTo(this.buffer[mid]);
else c=this.com.compare(obj,this.buffer[mid]);
if(c==0){
return mid;
}
else if(c<0){
max=mid-1;
}
else{
min=mid+1;
}
}
mid =(min+max) >>1;
return mid+1;
}
this.contains=contains;
function contains(obj){
if(this.length==0) return false;
var min=0,max=this.length-1;
var mid=0;
while(min<=max){
mid = (min+max) >> 1;
var c=0;
if(this.com==null) c=obj.compareTo(this.buffer[mid]);
else c=this.com.compare(obj,this.buffer[mid]);
if(c==0){
return true;
}
else if(c<0){
max=mid-1;
}
else{
min=mid+1;
}
}
return false;
}
this.equals=equals;
function equals(obj){
if(this.size()!=obj.size()) return false;
for(var i=0;i<this.length;i++){
if(!obj.get(i).equals(this.buffer[i])) return false;
}
return true;
}
this.addAll=addAll;
function addAll(list){
var mod=false;
for(var it=list.iterator();it.hasNext();){
var v=it.next();
if(this.add(v)) mod=true;
}
return mod;
}
this.removeAll=removeAll;
function removeAll(list){
for(var i=0;i<list.size();i++){
this.remove(this.indexOf(list.get(i)));
}
}
this.retainAll=retainAll;
function retainAll(list){
for(var i=this.length-1;i>=0;i--){
if(!list.contains(this.buffer[i])){
this.remove(i);
}
}
}
this.subList=subList;
function subList(begin,end){
if(begin<0) begin=0;
if(end>this.length) end=this.length;
var newsize=end-begin;
var newbuffer=new Array();
for(var i=0;i<newsize;i++){
newbuffer[i]=this.buffer[begin+i];
}
return new SortedList(newbuffer);
}
this.iterator=iterator;
function iterator(){
return new ListIterator(this.buffer,this.length);
}
}