新手求JAVA的若干知识点
package colletiontext5;
import java.util.*;
public class Colletiontext5
{
// private static void myComparator() {
// throw new UnsupportedOperationException("");
// }
//注意此处若不加static,Collections.sort(listObj,new myComparator());就会出错
//non-static variable this cannot be referenced from a sattic context
//一个静态上下文或者背景或者环境不能引用非静态变量
public static class myComparator implements Comparator
{//自动执行决定排序原则的Coparator
public int compare(Object o1,Object o2)
{
//希望由高到低排序
if(o1 instanceof Grades && o2 instanceof Grades)
{
if(((Grades)o1).getSum()<((Grades)o2).getSum())
return 1;//希望总分低的排在后面
else if(((Grades)o1).getSum()==((Grades)o2).getSum())
return 0;
else
return -1;
}
return 0;
}
public boolean equals(Object obj)
{
return super.equals(obj);
}
}
public static void main(String[] args) {
LinkedList listObj = new LinkedList();//创建一个新的空的 LinkedList
listObj.add(new Grades(132007,"CYH",new int[]{100,93,89,92}));
listObj.add(new Grades(319202,"David",new int[]{67,87,76,80}));
listObj.add(new Grades(217183,"Axel",new int[]{75,93,79,83}));
listObj.add(new Grades(851924,"Nimo",new int[]{88,98,44,49}));
listObj.add(new Grades(510018,"fish",new int[]{91,86,99,87}));
listObj.add(new Grades(701225,"Irving",new int[]{79,98,86,87}));
listObj.add(new Grades(231198,"林小白",new int[]{28,25,9,39}));
listObj.add(new Grades(451172,"悟空",new int[]{90,57,79,68}));
listObj.add(new Grades(431458,"NaNa",new int[]{71,65,79,69}));
listObj.add(new Grades(220140,"路人甲",new int[]{56,57,55,62}));
//搞不懂netbeans中一个汉字占多少个字节啊,既不是一个也不是两个,晕了……
//下面这个地方也搞懵了,为什么数上的方法不对?书上少了一个static
Collections.sort(listObj,new myComparator());//根据指定方式排序
System.out.println("名次 学号 姓名 成绩");
Grades tmpG;
for(int x = 0;x<listObj.size();x++)
{
tmpG = (Grades)(listObj.get(x));
//由此LinkedList取得某位置的一笔数据
System.out.println(Grades.checkGrade(x+1)+" "+tmpG.getInLine());
//x+1即该笔的名次
}
}
}
class Grades
{
//产生的对象代表一笔数据
int num;//学号
String theName;//姓名
int[] theGrade;//各科成绩
public Grades(int n,String na,int[] g)
{
num = n;
theName = na;
theGrade = g;
}
public int getSum()
{
//求总成绩
int sum = 0;
for(int x = 0;x<theGrade.length;x++)
{
sum = sum + theGrade[x];
}
return sum;
}
public static String checkGrade(int grade)
{
//若grade数字转为字符串后的长度不足3,则以空白填于其前
String gradeStr = String.valueOf(grade);
if(gradeStr.length()==1)//一位数
gradeStr = " "+gradeStr;//前面补两个空格
else if(gradeStr.length()==2)
gradeStr = " "+gradeStr;
return gradeStr;
}
public String getInLine()
{
//返回一个代表此笔数据的字符串
StringBuffer tmpLine = new StringBuffer();
//内容可变字符串
//以append()将新内容接在原内容之后
tmpLine.append(num);
tmpLine.append(" ");
tmpLine.append(theName);
if(tmpLine.toString().getBytes().length<16)
{
//以英文字母占1byte,一中文字占2byte
//到姓名为止,统一要有16byte的长度,否则就加空白
int addNum = 16 - tmpLine.toString().getBytes().length;
for(int n = 1;n<=addNum;n++)
tmpLine.append(" ");
}
for(int x=0;x<theGrade.length;x++)
{
tmpLine.append(checkGrade(theGrade[x]));
tmpLine.append(" ");
}
tmpLine.append(" 总分:");
tmpLine.append(getSum());
tmpLine.append(" ");
tmpLine.append("平均:");
tmpLine.append((float)getSum()/theGrade.length);
return tmpLine.toString();
}
}
运行结果:
run:
名次 学号 姓名 成绩
1 132007 CYH 100 93 89 92 总分:374 平均:93.5
2 510018 fish 91 86 99 87 总分:363 平均:90.75
3 701225 Irving 79 98 86 87 总分:350 平均:87.5
4 217183 Axel 75 93 79 83 总分:330 平均:82.5
5 319202 David 67 87 76 80 总分:310 平均:77.5
6 451172 悟空 90 57 79 68 总分:294 平均:73.5
7 431458 NaNa 71 65 79 69 总分:284 平均:71.0
8 851924 Nimo 88 98 44 49 总分:279 平均:69.75
9 220140 路人甲 56 57 55 62 总分:230 平均:57.5
10 231198 林小白 28 25 9 39 总分:101 平均:25.25
成功生成(总时间:0 秒)
如果我把其中的中文名字全改为六个字符的英文字符,则会对齐。
问题是:1、netbeans环境下到底一个汉字字符占几个byte?
2、为什么上面的myComparator类必须加个static才行,求详解。
3、不懂那个myComparator是如何排序的,或者说Comparator是如何排序的,为什么就返回1、0、-1就可以实现排序了呢?
4、另外java程序中有一个init()方法,在程序中并没有调用它的语句,为什么会自动运行呢,它是自动运行的吗?
小弟刚开始学java,谢谢各位高手了!
[解决办法]
和什么对齐了? 一个汉字的存储占两个字节,至于显示的话,我认为一般宽度也是英文字母的两倍。
不用必须吧,只要能引用:
3、不懂那个myComparator是如何排序的,或者说Comparator是如何排序的,为什么就返回1、0、-1就可以实现排序了呢?
内部排序算法封装了而已,对某一个集合按照某一个可比较量进行排序,排序规则由用户输入,1 0 -1只是代号,分别表示> = <
可以理解为框架中的代码,先于用户可编写代码运行。