A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王德升 中级黑马   /  2012-7-4 17:54  /  1517 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王德升 于 2012-7-5 18:21 编辑

一:

class StringTest
{
        public static void sop(String str)
        {
                System.out.println(str);
        }

        public static void main(String[] args)
        {
                String s = "ab cd";
                sop(s);

                sop(reverseString(s,2,3));//这里一换还是原来的字符串,你知道为什么吗?

                //s = myTrim(s);

                //sop("("+s+")");

        }
        
        //练习一:去除字符串两端空格。
        public static String myTrim(String str)
        {
                int start = 0,end=str.length()-1;

                while(start<=end && str.charAt(start)==' ')
                        start++;

                while(start<=end && str.charAt(end)==' ')
                        end--;

                return str.substring(start,end+1);
        }
        
        //练习二:将字符串进行翻转。

        public static String reverseString(String str,int start,int end)
        {
                char[] chs = str.toCharArray();

                reverse(chs,start,end);

                return new String(chs);
        }

        public static String reverseString(String str)
        {
                return reverseString(str,0,str.length());
        }

        public static void reverse(char[] ch,int x,int y)
        {

                for(int start=x,end=y-1;start<end;start++,end--)//这里start++,end--中间为什么是逗号不是分号,有什么诀窍啊,要怎么区分呢?

                swap(ch,start,end);

        }

        public static void swap(char[] arr,int x, int y)
        {
                char temp = arr[x];

                arr[x] = arr[y];

                arr[y] = temp;
        }
        
}


二:

ArrayList()默认的构造长度是10.如果再加元素,会默认的延长50%,也就是15,
我想问下这个延长是怎么延长的?还有的原来元素的分配以及心元素的分配。

0 1 2 3 4 5 ...
数字是角标,这个延长是加在0角标的前面还是10角标的后面呢,?



三;

import java.util.*;

class Student// implements Comparable
{
        private String name;        
        private int age;

        Student(String name,int age)
        {
                this.name = name;
                this.age = age;
        }
        /*
        public int compareTo(Object obj)
        {
                if(!(obj instanceof Student))
                        throw new RuntimeException("不是学生对象");

                Student s = (Student)obj;

                if(this.age>s.age)
                        return 1;

                if(this.age==s.age)
                        return this.name.compareTo(s.name);

                return -1;
        }
        */

        public String getName()
        {
                return name;
        }

        public int getAge()
        {
                return age;
        }
}

class TreeSetDemo
{
        public static void main(String[] ages)
        {
                TreeSet ts = new TreeSet();

                ts.add(new Student("xiaozhang03",34));
                //ts.add(new Student("xiaozhang03",34));
                //ts.add(new Student("xiaozhang02",53));
                //ts.add(new Student("xiaozhang01",37));

                for(Iterator it = ts.iterator(); it.hasNext(); )
                {

                        Student stu = (Student)it.next();

                        System.out.println(stu.getName()+"..."+stu.getAge());
                }

               
        }
}

为什么我这里留了一个new Student却编译不出来呢,而老毕的却可以呢?jvm版本问题???

四:
class MyCompare implements Comparator
{
        public int compare(Object o1,Object o2)
        {
                Student s1 = (Student)o1;
                Student s2 = (Student)o2;
               
                int num = s1.getName().compareTo(s2.getName());
                if(num==0)
                {
                        return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));//这为什么也要写return?
                }
                return num;//这里为什么要返回num?
        }
}

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

5 个回复

倒序浏览
1.   sop(reverseString(s,2,3));//这里一换还是原来的字符串,你知道为什么吗?
        reverseString调用的是 reverse(chs,start,end);这个方法包含头不包含尾,所以reverseString(s,2,3));就是把2反转,没效果
2. for(int start=x,end=y-1;start<end;start++,end--)//这里start++,end--中间为什么是逗号不是分号,有什么诀窍啊,要怎么区分呢?
        ;代表一句语句结束,是先后顺序。
         “,”代表并列关系,同属于一条语句
3.为什么我这里留了一个new Student却编译不出来呢,而老毕的却可以呢?jvm版本问题???
class Student implements Comparable//Student没有可比性所以要,自定义 comparaTo,并实现Comparable。你的comparaTo没问题。
{
4. int num = s1.getName().compareTo(s2.getName());
                if(num==0)//如果==0,name相同所以再比较Age。下面的语句是比较Age,毕老师写成一句话了
                {
                        return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));//这为什么也要写return?
                }
                return num;//compare返回的是一个Int值,通过对值的判断看出谁大谁小,所以如果!=0,就必须返回一个值。


     
回复 使用道具 举报
1、sop(reverseString(s,2,3));//这里一换还是原来的字符串,你知道为什么吗?。解答:这里的问题是因为你在下面进行“for(int start=x,end=y-1;start<end;start++,end--)”这个循环时end的值搞错了 应该是end=y 而不是y-1 如果是y-1 就会出现从ch[2]到ch【2】  所以你将那个空的值 翻转了 所以不会变化  还有一楼的reverse()的说法我不赞同 刚才我试写下 reverse(s,star,end)头尾都包括的  
2、  for(int start=x,end=y-1;start<end;start++,end--)//这里start++,end--中间为什么是逗号不是分号,有什么诀窍啊,要怎么区分呢?解答:看条件的实质 for(;;)两个分号  当两个条件功能相同,比如都是自加自减或者都是比较 他们之间用“,”隔开但是两个不同功能就用;号隔开  我的表述不大好 希望你能理解
3、0 1 2 3 4 5 ...数字是角标,这个延长是加在0角标的前面还是10角标的后面呢,?解答:我认为时从后面加入的 想想就明白 之所以延长是因为已经存储了数据但是内存不够,增加当然从后面加 如果从前面加岂不是要将所有的元素都后移  效率多低  所以明显不是
、4、为什么我这里留了一个new Student却编译不出来呢,而老毕的却可以呢?jvm版本问题???这个解答:是编过几个程序 也是同样问题 但是编译有提示运行就ok了  在jre1.6的环境中,范型的使用都会报类似警告即支持范型的容器应该定义范型类型然后再使用

5、最后一个问题稍等哈
回复 使用道具 举报
陆强强 发表于 2012-7-4 18:30
1.   sop(reverseString(s,2,3));//这里一换还是原来的字符串,你知道为什么吗?
        reverseString调 ...

谢谢! 但是第3个我还不是很明白,最好把Comparable和Comparator怎么区分,谢谢了
回复 使用道具 举报
最后一个问题要返回num的值是比较两个学生是否为同一个人 所以要返回num来判断如果不是0那就是名字都不同 所以肯定不是一个人 是个判断的信号
回复 使用道具 举报
王德升 发表于 2012-7-4 19:23
谢谢! 但是第3个我还不是很明白,最好把Comparable和Comparator怎么区分,谢谢了 ...

总结一下就是comparaTo是覆盖comparable接口的comparaTo方法,实现用implements
比较器是继承并覆盖Compare中的compare方法。继承用extends
一一对应就好
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马