A new class -->String
jinheking
caoqi at bgi.net.cn
Wed Apr 4 02:37:59 PDT 2007
String opAssign(wchar[] value) {
int size = value.length;
offset = 0;
count = size;
value = value;
return this;
}
That is this funcation!
"Frits van Bommel" <fvbommel at REMwOVExCAPSs.nl> дÈëÏûÏ¢ÐÂÎÅ:euvo53$3rg$1 at digitalmars.com...
> jinheking wrote:
>> I want to make a Class like java's String Class.
>> module jdk2d.lang;
>>
>> import std.stdio;
>> /*
>> * The <code>String</code> class represents character strings. All
>> * string literals in D programs, such as <code>"abc"</code>, are
>> * implemented as instances of this class.
>
> I don't think last bit is going to happen.
>
>> * @author Caoqi
>> * @version 0.001, 07/03/30
>> * @since JDK2D 0.02
>> * @url http://jinheking.javaeye.com/admin
>> * <p>
>> */
>>
>> public class String{
>> private final wchar[] value;
>>
>> /** The offset is the first index of the storage that is used. */
>> private final int offset;
>>
>> /** The count is the number of characters in the String. */
>> private final int count;
>
> Those last two are unnecessary. wchar[] + slicing takes care of
> everything.
> So all you need is
> private final wchar[] value;
> (and when the new constness proposal comes through, add const (or better
> yet, invariant) to that)
>
>> /*
>> * Initializes a newly created {@code String} object so that it
>> represents
>> * an empty character sequence. Note that use of this constructor is
>> * unnecessary since Strings are immutable.
>> */
>> this(){
>> this.offset = 0;
>> this.count = 0;
>> this.value = new wchar[0];
>
> just
> this.value = null;
> will do just fine.
>
>> }
>>
>> String opAssign(wchar[] value) {
>> int size = value.length;
>> offset = 0;
>> count = size;
>> value = value;
>> return this;
>
> (You forgot a 'this' in front of the left-hand 'value' in that assignment)
>
> this.value = value.dup;
> To be sure the code outside can't modify the contents.
> Once constness comes through, add an overload that takes an invariant
> wchar[] and doesn't dup.
>
>> }
>>
>> /*
>> * Allocates a new {@code String} so that it represents the sequence
>> of
>> * characters currently contained in the character array argument.
>> The
>> * contents of the character array are copied; subsequent
>> modification of
>> * the character array does not affect the newly created string.
>> *
>> * @param value
>> * The initial value of the string
>> */
>> public this(wchar[] value) {
>> int size = value.length;
>> this.offset = 0;
>> this.count = size;
>> this.value = value;
>
> Same as above:
> this.value = value.dup;
>
>> }
>>
>> /**
>> * Returns the length of this string.
>> * The length is equal to the number of <a
>> href="Character.html#unicode">Unicode
>> * code units</a> in the string.
>> *
>> * @return the length of the sequence of characters represented by
>> this
>> * object.
>> */
>> public int length() {
>> return count;
>
> return value.length;
>
>> }
>>
>> /**
>> * Returns <tt>true</tt> if, and only if, {@link #length()} is
>> <tt>0</tt>.
>> *
>> * @return <tt>true</tt> if {@link #length()} is <tt>0</tt>,
>> otherwise
>> * <tt>false</tt>
>> *
>> * @since JDK2D 0.01
>> */
>> public bool isEmpty() {
>> return count == 0;
>
> return value.length == 0;
>
>> }
>> /**
>> * Returns the index within this string of the first occurrence of
>> the
>> * specified substring. The integer returned is the smallest value
>> * <i>k</i> such that:
>> * <blockquote><pre>
>> * this.startsWith(str, <i>k</i>)
>> * </pre></blockquote>
>> * is <code>true</code>.
>> *
>> * @param str any string.
>> * @return if the string argument occurs as a substring within this
>> * object, then the index of the first character of the
>> first
>> * such substring is returned; if it does not occur as a
>> * substring, <code>-1</code> is returned.
>> */
>>
>> public int indexOf(String str) {
>> return indexOf(str, 0);
>> }
>>
>> public int indexOf(wchar[] str) {
>> return indexOf(str, 0);
>> }
>>
>> /**
>> * Returns the index within this string of the first occurrence of
>> the
>> * specified substring, starting at the specified index. The integer
>> * returned is the smallest value <tt>k</tt> for which:
>> * <blockquote><pre>
>> * k >= Math.min(fromIndex, this.length()) &&
>> this.startsWith(str, k)
>> * </pre></blockquote>
>> * If no such value of <i>k</i> exists, then -1 is returned.
>> *
>> * @param str the substring for which to search.
>> * @param fromIndex the index from which to start the search.
>> * @return the index within this string of the first occurrence of
>> the
>> * specified substring, starting at the specified index.
>> */
>> public int indexOf(String str, int fromIndex) {
>> return indexOf(value, offset, count,
>> str.value, str.offset, str.count, fromIndex);
>> }
>>
>> public int indexOf(wchar[] wstr, int fromIndex) {
>> String str=new String(wstr);
>> return indexOf(value, offset, count,
>> str.value, str.offset, str.count, fromIndex);
>> }
>>
>> /**
>> * Code shared by String and StringBuffer to do searches. The
>> * source is the character array being searched, and the target
>> * is the string being searched for.
>> *
>> * @param source the characters being searched.
>> * @param sourceOffset offset of the source string.
>> * @param sourceCount count of the source string.
>> * @param target the characters being searched for.
>> * @param targetOffset offset of the target string.
>> * @param targetCount count of the target string.
>> * @param fromIndex the index to begin searching from.
>> */
>> static int indexOf(wchar[] source, int sourceOffset, int sourceCount,
>> wchar[] target, int targetOffset, int targetCount,
>> int fromIndex) {
>> if (fromIndex >= sourceCount) {
>> return (targetCount == 0 ? sourceCount : -1);
>> }
>> if (fromIndex < 0) {
>> fromIndex = 0;
>> }
>> if (targetCount == 0) {
>> return fromIndex;
>> }
>>
>> wchar first = target[targetOffset];
>> int max = sourceOffset + (sourceCount - targetCount);
>>
>> for (int i = sourceOffset + fromIndex; i <= max; i++) {
>> /* Look for first character. */
>> if (source[i] != first) {
>> i++;
>> while (i <= max && source[i] != first){
>> i++;
>> }
>> }
>>
>> /* Found first character, now look at the rest of v2 */
>> if (i <= max) {
>> int j = i + 1;
>> int end = j + targetCount - 1;
>> for (int k = targetOffset + 1; j < end && (source[j] ==
>> target[k]);j++){
>> k++;
>> }
>>
>> if (j == end) {
>> /* Found whole string. */
>> return i - sourceOffset;
>> }
>> }
>> }
>> return -1;
>> }
>
> Using slicing so offset and counts don't need to be passed will allow you
> to implement these more cleanly, I think.
>
>>
>> char[] toString(){
>> return cast(char[])std.utf.toUTF8(this.value);
>
> This is broken for your implementation but just fine for mine. (It doesn't
> work for substrings in yours, it'll convert the entire string instead of
> just the part this String object represents)
>
>> }
>> }
>>
>> public static void main() {
>> String str = new String("The quick brown fox jumped over the lazy
>> dog.");
>> String s1 = new String("abc");
>> s1="abc";
>> writefln(s1);
>> printf("%d\n",str.indexOf("z"));
>> printf("%d\n",str.isEmpty());
>> }
>
> As a final note, there's a (less Java-like) string class implementation at
> http://www.dprogramming.com/dstring.php. It stores its data as char[],
> wchar[] or dchar[] and tries to use whichever is the most space-efficient
> yet can still store all elements in a single array element. The last bit
> allows it to implement "intuitive" slicing, never slicing in the middle of
> a group of UTF-8 or UTF-16 code units that form a single character point
> (if I got the terminology right).
More information about the Digitalmars-d
mailing list