首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

新手求JAVA的若干知识点,该怎么解决

2013-01-26 
新手求JAVA的若干知识点//运用Collection的范例,将学生成绩按由高到低的顺序排列package colletiontext5i

新手求JAVA的若干知识点

//运用Collection的范例,将学生成绩按由高到低的顺序排列
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,谢谢各位高手了!
[解决办法]

引用:
如果我把其中的中文名字全改为六个字符的英文字符,则会对齐。
问题是:1、netbeans环境下到底一个汉字字符占几个byte?

和什么对齐了? 一个汉字的存储占两个字节,至于显示的话,我认为一般宽度也是英文字母的两倍。

引用:
  2、为什么上面的myComparator类必须加个static才行,求详解。

不用必须吧,只要能引用:
  3、不懂那个myComparator是如何排序的,或者说Comparator是如何排序的,为什么就返回1、0、-1就可以实现排序了呢?

内部排序算法封装了而已,对某一个集合按照某一个可比较量进行排序,排序规则由用户输入,1 0 -1只是代号,分别表示> = <

引用:
  4、另外java程序中有一个init()方法,在程序中并没有调用它的语句,为什么会自动运行呢,它是自动运行的吗?

可以理解为框架中的代码,先于用户可编写代码运行。

热点排行