Chinaunix首页 | 论坛 | 博客
  • 博客访问: 283673
  • 博文数量: 41
  • 博客积分: 2630
  • 博客等级: 少校
  • 技术积分: 702
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-30 15:56
文章分类

全部博文(41)

文章存档

2012年(2)

2011年(2)

2010年(3)

2009年(26)

2008年(8)

我的朋友

分类: Java

2008-04-16 16:48:58

    看了些JDK的源码,比较喜欢他们的类层次设计,比较清晰,有助于理解Java的各种概念。推荐优先看下java.util.LinkedList 和 Java.lang.String。
    今天把Java.lang.String简化成了DString,去掉了不常用的功能。但关于大小写转化的代码还没有看,有时间再好好研究一下。

public final class DString
implements CharSequence, Comparable<DString> {

    /*测试*/
    public static void main(String[] args){
        DString s = new DString("daxi".toCharArray());

        System.out.println( s.toString() );
        System.out.println( s.charAt(0) );
        System.out.println( s.equalsIgnoreCase(" DAXI") );
        System.out.println( s.equalsIgnoreCase(

            new DString(" DAXI ".toCharArray()).trim() ) );
        System.out.println( s.indexOf('x') );
        System.out.println( s.startsWith("d", 1) );
        System.out.println( s.compareTo( new DString("da".toCharArray()) ) );

        
/* 输出
         * daxi
         * d
         * false
         * true
         * 2
         * false
         * 2
         */

    }

    public DString() {
        this.count_ = 0;
        this.value_ = new char[0];
    }

    public DString(char value[]) {
        int size = value.length;
        char[] v = new char[size];
        System.arraycopy(value, 0, v, 0, size);
        this.count_ = size;
        this.value_ = v;
    }

    DString(char value[], int count) {
        this.value_ = value;
        this.count_ = count;
    }


    
/** 返回此字符串的长度。
     * @see java.lang.CharSequence#length()
     */

    public int length() {
        return count_;
    }

    public String toString() {
        return new String(this.value_);
    }


    
/** 返回指定索引处的 char 值。
     * @see java.lang.CharSequence#charAt(int)
     */

    public char charAt(int index) {
        if ((index < 0) || (index >= count_)) {
            throw new StringIndexOutOfBoundsException(index);
        }
        return value_[index];
    }

    
/** 比较此字符串与指定的对象。
     */

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof DString) {
            DString anotherString = (DString)anObject;
            int n = count_;
            if (n == anotherString.count_) {
                char v1[] = value_;
                char v2[] = anotherString.value_;
                int i = 0;
                int j = 0;
                while (n-- != 0) {
                    if (v1[i++] != v2[j++])
                        return false;
                }
                return true;
            }
        }
        return false;
    }

    /**将此串与另一个String进行比较,不考虑大小写。*/
    public boolean equalsIgnoreCase(String anotherString) {
        return     (anotherString != null) && (anotherString.length() == count_) &&
        regionMatches(true, anotherString, count_);
    }

    
/**按字典顺序比较两个字符串。
     * @see java.lang.Comparable#compareTo(java.lang.Object)
     */

    public int compareTo(DString anotherString) {
        int len1 = count_;
        int len2 = anotherString.length();
        int n = Math.min(len1, len2);
        char v1[] = value_;
        char v2[] = anotherString.value_;
        int i = 0;
        int j = 0;

        if (i == j) {
            int k = i;
            int lim = n + i;
            while (k < lim) {
                char c1 = v1[k];
                char c2 = v2[k];
                if (c1 != c2) {
                    return c1 - c2;
                }
                k++;
            }
        } else {
            while (n-- != 0) {
                char c1 = v1[i++];
                char c2 = v2[j++];
                if (c1 != c2) {
                    return c1 - c2;
                }
            }
        }
        return len1 - len2;
    }

    /**测试此字符串是否以指定的前缀开始。该前缀以指定索引开始*/
    public boolean startsWith(String prefix, int toffset) {
        char ta[] = value_;
        int to = toffset;

        int po = 0;
        int pc = prefix.length();

        
// Note: toffset might be near -1>>>1.
        if ((toffset < 0) || (toffset > count_ - pc)) {
            return false;
        }
        while (--pc >= 0) {
            if (ta[to++] != prefix.charAt(po++) ) {
                return false;
            }
        }
        return true;
    }

    /**测试此字符串是否以指定的前缀开始。*/
    public boolean startsWith(String prefix) {
        return startsWith(prefix, 0);
    }

    /**测试此字符串是否以指定的后缀结束。*/
    public boolean endsWith(String suffix) {
        return startsWith(suffix, count_ - suffix.length());
    }

    /**测试两个字符串区域是否相等。*/
    public boolean regionMatches(boolean ignoreCase,
            String other, int len) {
        char ta[] = value_;
        char pa[] = other.toCharArray();
        int to = 0;
        int po = 0;


        
//Note: len might be near -1>>>1.
        if ( ( (long)count_ - len) < 0 ||
                ( (long)other.length() - len) <0 ) {
            return false;
        }
        while (len-- > 0) {
            char c1 = ta[to++];
            char c2 = pa[po++];
            if (c1 == c2) {
                continue;
            }
            if (ignoreCase) {
                
// If characters don't match but case may be ignored,
                
// try converting both characters to uppercase.
                
// If the results match, then the comparison scan should

                
// continue.

                char u1 = Character.toUpperCase(c1);
                char u2 = Character.toUpperCase(c2);
                if (u1 == u2) {
                    continue;
                }
             // Unfortunately, conversion to uppercase does not work properly
             // for the Georgian alphabet, which has strange rules about case
             // conversion. So we need to make one last check before
           
// exiting.

                if (Character.toLowerCase(u1) == Character.toLowerCase(u2)) {
                    continue;
                }
            }
            return false;
        }
        return true;
    }

    /**从指定的索引开始搜索,返回在此字符串中第一次出现指定字符处的索引。*/
    public int indexOf(int ch, int fromIndex) {
        int max = count_;
        char v[] = value_;

        if (fromIndex < 0) {
            fromIndex = 0;
        } else if (fromIndex >= count_) {
            
// Note: fromIndex might be near -1>>>1.
            return -1;
        }

        int i = fromIndex;
        if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
            // handle most cases here (ch is a BMP code point or a
            
// negative value_ (invalid code point))

            for (; i < max ; i++) {
                if (v[i] == ch) {
                    return i;
                }
            }
            return -1;
        }

        if (ch <= Character.MAX_CODE_POINT) {
            
// handle supplementary characters here
            char[] surrogates = Character.toChars(ch);
            for (; i < max; i++) {
                if (v[i] == surrogates[0]) {
                    if (i + 1 == max) {
                        break;
                    }
                    if (v[i+1] == surrogates[1]) {
                        return i;
                    }
                }
            }
        }
        return -1;
    }

    /**返回指定字符在此字符串中第一次出现处的索引。*/
    public int indexOf(int ch) {
        return indexOf(ch, 0);
    }

    /**从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引。*/
    public int indexOf(String str, int fromIndex) {
        return indexOf(value_, count_, str.toCharArray(), str.length(), fromIndex);
    }

    /** 返回一个新的字符序列*/
    public String substring(int beginIndex, int endIndex) {
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
        }
        if (endIndex > count_) {
            throw new StringIndexOutOfBoundsException(endIndex);
        }
        if (beginIndex > endIndex) {
            throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
        }
        return     new String(value_, beginIndex, endIndex - beginIndex);
    }


    
/** 返回一个新的字符序列,它是此序列的一个子序列。
     * @see java.lang.CharSequence#subSequence(int, int)
     */

    public CharSequence subSequence(int start, int end) {
        if (start < 0) {
            throw new StringIndexOutOfBoundsException(start);
        }
        if (end > count_) {
            throw new StringIndexOutOfBoundsException(end);
        }
        if (start > end) {
            throw new StringIndexOutOfBoundsException(end - start);
        }
        return ((start == 0) && (end == count_)) ? this :
            new String(value_, 0, end - start);
    }

    /** 返回字符串的副本,忽略前导空白和尾部空白。*/
    public String trim() {
        int len = count_;
        int st = 0;
        char[] val = value_; /* avoid getfield opcode */

        while ((st < len) && (val[st] <= ' ')) {
            st++;
        }
        while ((st < len) && (val[len - 1] <= ' ')) {
            len--;
        }
        return

        ((st > 0) || (len < count_)) ? substring(st, len) : this.toString();
    }

    private int indexOf(char[] source, int sourceCount,
            char[] target, int targetCount,
            int fromIndex) {
        if (fromIndex >= sourceCount) {
            return (targetCount == 0 ? sourceCount : -1);
        }
        if (fromIndex < 0) {
            fromIndex = 0;
        }
        if (targetCount == 0) {
            return fromIndex;
        }

        char first = target[0];
        int max = sourceCount - targetCount;

        for (int i = fromIndex; i <= max; i++) {
            /* Look for first character. */
            if (source[i] != first) {
                while (++i <= max && source[i] != first);
            }

            /* find first character, now look at the rest of v2 */
            if (i <= max) {
                int j = i + 1;
                int end = j + targetCount - 1;
                for (int k = 1; j < end && source[j] ==
                    target[k]; j++, k++);

                if (j == end) {
                    /* find whole string. */
                    return i;
                }
            }
        }
        return -1;
    }


    /**字符数组值*/
    private final char value_[];

    /**串中的字符个数*/
    private final int count_;
}

阅读(2468) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:项目的Release版的导出部分挂掉了

给主人留下些什么吧!~~