}elseif(key>a[mid]){
lo=mid+1;
counter.increment();
StdOut.println(">c="+counter.tally());
}else{
StdOut.println("c="+counter.tally());
returnmid;
}
}
return-1;
}
/**
*Readsinasequenceofintegersfromthewhitelistfile,specifiedasa
*command-lineargument.Readsinintegersfromstandardinputandprints
*tostandardoutputthoseintegersthatdo*not*appearinthefile.
*/
publicstaticvoidmain(String[]args){
//readtheintegersfromafile
Inin=newIn("LargeW");
int[]whitelist=in.readAllInts();
Countercounter=newCounter("counter");
//sortthearray
Arrays.sort(whitelist);
StdOut.println(whitelist.length);
//readintegerkeyfromstandardinput;printifnotinwhitelist
while(!
StdIn.isEmpty()){
intkey=StdIn.readInt();
if(rank(key,whitelist,counter)==-1)
StdOut.println(key);
}
}
}
/*
*1.2.10编写一个VisualCounter类,支持加一和减一操作。
它的构造函数接受两个参数N和max,
*其中N指定了操作的最大次数,max指定了计数器的最大绝对值。
作为副作用,用图像显示每次计数器变化后的值。
*/
publicclassVisualCounter{
privateintcount;
privateintmaxOperation;
privateintval;//RecordvalueoftheCounter
privateintmaxVal;
privateintx=0;
publicVisualCounter(intN,intmax){
maxOperation=N;
maxVal=max;
StdDraw.setXscale(0,N);
StdDraw.setYscale(-max,max);
StdDraw.setPenRadius(0.005);
//TODOAuto-generatedconstructorstub
}
//currentvalue
/**
*Initializesanewcounterstartingat0,withthegivenid.
*
*@paramid
* thenameofthecounter
*/
/**
*Incrementsthecounterby1.
*/
publicvoidincrement(){
if(countcount++;
val++;
x++;
StdDraw.setPenColor(StdDraw.BLACK);
StdDraw.point(x,val);
}
}
/**
*decrementthecounterby1.
*/
publicvoiddecrement(){
if(count-maxVal){
count++;
val--;
x++;
StdDraw.setPenColor(StdDraw.RED);
StdDraw.point(x,val);
}
}
/**
*Returnsthecurrentcount.
*/
publicinttally(){
returncount;
}
/**
*Returnsastringrepresentationofthiscounter
*/
publicStringtoString(){
returncount+"";
}
publicstaticvoidmain(String[]args){
VisualCounterVC=newVisualCounter(2000,1000);
for(inti=0;i<2000;i++){
if(i/1000==1)
VC.decrement();
else
VC.increment();
}
StdOut.println(VC.tally());
}
}
/*
*1.2.11根据Date的API实现SmartDate类型在日期非法时抛出一个异常
*1.2.12为SmartDate添加一个方法dayofWeek(),为日期返回一个星期。
*1.2.19字符串解析。
*/
publicclassSmartDateimplementsDatable{
privatefinalintmonth;
privatefinalintday;
privatefinalintyear;
publicintmonth(){
returnmonth;
}
publicintday(){
returnday;
}
publicintyear(){
returnyear;
}
/*
*原理:
蔡勒公式:
W={[C/4]-2C+y+[y/4]+[26(m+1)/10]+d-1}%7(其中[]为取整符号)
*其中,W是所求日期的星期数.如果求得的数大于7,可以减去7的倍数,直到余数小于7为止.c是公元年份
*的前两位数字,y是已知公元年份的后两位数字;m是月数,d是日数.方括[]表示只截取该数的整数部分。
*/
publicStringdayofWeek(){
intw=(year/100/4-2*(year/100)+year%100+year%100
/4+26*(month+1)/10+day-1)%7;
switch(w){
case1:
return"Monday";
case2:
return"Tuseday";
case3:
return"Wednesday";
case4:
return"Thu