//Top类实现积分榜,创建该类对象后,调用相应方法操作积分榜
import java.io.*;
import javax.microedition.rms.*;
public class Top { //与积分榜有关的类
private int leastscore=0; //最少要多少次才能上积分榜
private String fname;
private int mes;
private RecordStore rs;
//判断是否是新纪录
public boolean isNewRecord(int score){
if(score<=leastscore)return false;
else{
int i=0,getscore=0;
try {
rs=RecordStore.openRecordStore(fname, true);
myFilter mf=new myFilter(leastscore);
MyComparator mc=new MyComparator();
RecordEnumeration en=rs.enumerateRecords(mf,mc,true);
while(en.hasNextElement()&&(i<mes)){ //是否有下一条
byte dat[]=en.nextRecord();//得到下一条
for(int j=4;j>0;j--){
getscore<<=8; //一个字节
getscore|=dat[dat.length-j];
}
i++;
}
} catch (Exception e) {
System.out.println("读取过程出现异常");
e.printStackTrace();
}
finally{
try {
rs.closeRecordStore();
}
catch (RecordStoreException ex) {
return false;
}
}
// System.out.println("------------------------"+"i:"+i+" score:"+score+" getscore:"+getscore);
if(i<mes)return true;
else if(score>getscore) return true;
else return false;
}
}
//设置新纪录
public void set(String name,int score){
try {
rs=RecordStore.openRecordStore(fname, true);
ByteArrayOutputStream bo=new ByteArrayOutputStream();
DataOutputStream dao = new DataOutputStream(bo);
dao.writeUTF(0==name.length()?"----":name); //如果未输入名字,用四条杠代替
dao.writeInt(score);
byte[] data=bo.toByteArray();
rs.addRecord(data, 0, data.length);
dao.close();
bo.close();
} catch (Exception e) {
System.out.println("存储过程出现异常");
e.printStackTrace();
}
finally{
try {
rs.closeRecordStore();
}
catch (RecordStoreException ex) {
}
}
}
//输出积分榜
public String getTop(){
StringBuffer strb=new StringBuffer();
try {
RecordEnumeration en;
rs=RecordStore.openRecordStore(fname, true);
en=rs.enumerateRecords(new myFilter(leastscore),new MyComparator(),true);
strb.append("名字 分数\n");
int i=0;
while(en.hasNextElement()&&(i<mes)){ //是否有下一条
byte dat[]=en.nextRecord();//得到下一条
ByteArrayInputStream bis=new ByteArrayInputStream(dat);
DataInputStream dis=new DataInputStream(bis);
strb.append(dis.readUTF()) //读取昵称
.append(" ")
.append(dis.readInt()) //读取分数
.append("\n");
dis.close();
bis.close();
i++;
}
} catch (Exception e) {
System.out.println("读取过程出现异常");
e.printStackTrace();
}
finally{
try{
rs.closeRecordStore();
}
catch (RecordStoreException ex) {}
}
return strb.toString();
}
//重置积分榜
public void deleteAll(){
try {
RecordStore.deleteRecordStore(fname);
} catch (RecordStoreNotFoundException e) {
e.printStackTrace();
} catch (RecordStoreException e) {
e.printStackTrace();
}
}
//构造函数,三个参数分别是RecordStore的名字,积分榜显示的条数,至少上积分榜的分数
public Top(String fname,int mes,int leastscore){
this.fname=fname;
this.mes=mes;
this.leastscore=leastscore;
}
}
//自定义过滤器
class myFilter implements RecordFilter{
private int leastscore=0,score=0;
public boolean matches(byte[] dat) {
for(int i=4;i>0;i--){
score<<=8; //一个字节
score|=dat[dat.length-i];
}
if(score>leastscore)return true;
else return false;
}
public myFilter(int leastscore){
this.leastscore=leastscore;
}
}
class MyComparator implements RecordComparator{
public int compare(byte[] rec1,byte[] rec2){
int score1=0,score2=0;
for(int i=4;i>0;i--){ //4是int型所占字节数
score1<<=8; //一个字节
score2<<=8;
score1|=rec1[rec1.length-i];
score2|=rec2[rec2.length-i];
}
if(score1==score2){
return RecordComparator.EQUIVALENT;
}//if
if(score1>score2){
return RecordComparator.PRECEDES;
} else{
return RecordComparator.FOLLOWS;
}//else
}
}
j2me 积分榜的实现
最新推荐文章于 2019-09-22 18:51:08 发布