X Tutup
package com.asrez.utils; /** * * @Name : JavaMyString * @File : com/asrez/utils/MyString.java * @Version : 1.0 * @Programmer : Max * @Date : 2019-12-01 * @Released under : https://github.com/BaseMax/JavaMyString/blob/master/LICENSE * @Repository : https://github.com/BaseMax/JavaMyString * @Reference : https://courses.cs.washington.edu/courses/cse341/98au/java/jdk1.2beta4/docs/api/java/lang/String.html * **/ class MyString { private final int DEFAULT_ARRAY_SIZE = 10; private char[] array; private int length; public MyString() { length = DEFAULT_ARRAY_SIZE; array = new char[length]; } public MyString(char c) { length = DEFAULT_ARRAY_SIZE; array = new char[length]; array[0] = c; } public MyString(char c[]) { length = c.length; array = new char[length]; for(int i = 0; i < length; i++) array[i] = c[i]; } public MyString(MyString value) { length = value.length(); array = new char[length]; for(int i = 0; i < length; i++) array[i] = value.charAt(i); } public MyString(String value) { length = value.length(); array = new char[length]; for(int i = 0; i < length; i++) array[i] = value.charAt(i); } public int indexOf(int ch, int fromIndex) { if(fromIndex < 0) fromIndex = 0; else if(fromIndex >= length) return -1; for(int i = fromIndex; i < length; i++) if(array[i] == ch) return i; return -1; } public int indexOf(int ch) { return indexOf(ch, 0); } public boolean contains(String value) { return contains(new MyString(value)); } public boolean contains(char[] value) { return contains(new MyString(value)); } public boolean contains(MyString value) { if(indexOf(value) != -1) { return true; } return false; } public int indexOf(MyString str) { return indexOf(str, 0); } public int indexOf(char[] str, int fromIndex) { return indexOf(new MyString(str), fromIndex); } public int indexOf(MyString str, int fromIndex) { if(fromIndex < 0) fromIndex = 0; else if(fromIndex >= length) return -1; for(int i = fromIndex; i < length; i++) { if(array[i] == str.charAt(0)) { if(str.length() == 1) return i; int offset = 1; while(offset < str.length() && ((i + offset) < length) && ((str.charAt(offset)) ==(array[i + offset]))) { if(offset == str.length() - 1) return i; offset++; } } } return -1; } public int indexOf(String str) { return indexOf(str, 0); } public int indexOf(String str, int fromIndex) { if(fromIndex < 0) fromIndex = 0; else if(fromIndex >= length) return -1; for(int i = fromIndex; i < length; i++) { if(array[i] == str.charAt(0)) { if(str.length() == 1) return i; int offset = 1; while(offset < str.length() && ((i + offset) < length) && ((str.charAt(offset)) ==(array[i + offset]))) { if(offset == str.length() - 1) return i; offset++; } } } return -1; } public int lastIndexOf(int ch) { return lastIndexOf(ch, length - 1); } public int lastIndexOf(int ch, int fromIndex) { if(fromIndex >= length) fromIndex = length -1; for(int i = fromIndex; i >= 0; i--) if(array[i] == ch) return i; return -1; } public int lastIndexOf(String str) { return lastIndexOf(str, length - 1); } public int lastIndexOf(String str, int fromIndex) { if(fromIndex >= length) fromIndex = length -1; for(int i = fromIndex ; i >= 0; i--) { if(array[i] == str.charAt(0)) { if(str.length() == 1) return i; int offset = 1; while(offset < str.length() && ((i + offset) < length) && ((str.charAt(offset)) ==(array[i + offset]))) { if(offset == str.length() - 1) return i; offset++; } } } return -1; } public boolean equalsIgnoreCase(MyString other) { if(this.length != other.length) return false; int i = 0; char thisTemp,otherTemp; while(i < this.length) { if(this.array[i] >= 'A' && this.array[i] <= 'Z') thisTemp =(char)(this.array[i] - 'A' + 'a'); else thisTemp = this.array[i]; if(other.array[i] >= 'A' && other.array[i] <= 'Z') otherTemp =(char)(other.array[i] - 'A' + 'a'); else otherTemp = other.array[i]; if(thisTemp != otherTemp) return false; i++; } return true; } public boolean equalsIgnoreCase(String other) { if(this.length != other.length()) return false; int i = 0; char thisTemp,otherTemp; while(i < this.length) { if(this.array[i] >= 'A' && this.array[i] <= 'Z') thisTemp =(char)(this.array[i] - 'A' + 'a'); else thisTemp = this.array[i]; if(other.charAt(i) >= 'A' && other.charAt(i) <= 'Z') otherTemp =(char)(other.charAt(i) - 'A' + 'a'); else otherTemp = other.charAt(i); if(thisTemp != otherTemp) return false; i++; } return true; } public MyString toLowerCase() { MyString temp = new MyString(); temp.length = this.length; temp.array = new char [this.length]; for(int i = 0; i < this.length; i++) { if((this.array[i] >= 'A') &&(this.array[i] <= 'Z')) temp.array[i] =(char)(this.array[i] + 32); else temp.array[i] = this.array[i]; } return temp; } public MyString toLowerCaseAndUpdate() { MyString temp = toLowerCase(); this.length=temp.length; this.array=temp.array; return this; } public MyString toUpperCase() { MyString temp = new MyString(); temp.length = this.length; temp.array = new char [this.length]; for(int i = 0; i < this.length; i++) { if((this.array[i] >= 'a') &&(this.array[i] <= 'z')) temp.array[i] =(char)(this.array[i] - 32); else temp.array[i] = this.array[i]; } return temp; } public MyString toUpperCaseAndUpdate() { MyString temp = toUpperCase(); this.length=temp.length; this.array=temp.array; return this; } public int compareTo(MyString value) { if(this.length != value.length) return this.length - value.length; for(int i = 0; i < length; i++) if(this.array[i] != value.array[i]) return this.array[i] - value.array[i]; return 0; } public int compareToIgnoreCase(MyString value) { return this.toLowerCase().compareTo(value.toLowerCase()); } public MyString trim() { int frontSpaces = 0; int backSpaces = 0; int i = 0;// from first while((i < length) &&(array[i++] == ' ')) frontSpaces++; i = length - 1;// from last while((i >= frontSpaces) &&(array[i--] == ' ')) backSpaces++; MyString result = new MyString(); if((frontSpaces + backSpaces) <= length) { result.length = this.length - frontSpaces - backSpaces; result.array = new char [result.length]; for(i = 0; i < result.length; i++) result.array[i] = this.array[i + frontSpaces]; } return result; } public MyString trimAndUpdate() { MyString temp = trim(); this.length=temp.length; this.array=temp.array; return this; } public static MyString valueOf(boolean b) { if(b) return new MyString("true"); else return new MyString("false"); } public static String valueOf(Object obj) { if(obj == null) return "null"; return obj.toString(); } public String toString() { return new String(array); } public boolean equals(Object o) { MyString other; if(!(o instanceof MyString)) return false; else other = (MyString) o; if(this.length != other.length) return false; int i = 0; while(i < this.length) { if(this.array[i] != other.array[i]) return false; // same i++; } return true; } public static void printf(char[] format, Object... arguments) { MyString mystr=new MyString(format); printf(mystr, arguments); } public static void printf(String format, Object... arguments) { char[] formats=format.toCharArray(); MyString mystr=new MyString(formats); printf(mystr, arguments); } public static void printf(MyString format, Object... arguments) { int argumentIndex=0; for(int i = 0; i < format.array.length; i++) { if(format.array[i] == '%') { if(format.array.length > i+1 && format.array[i+1] == '%') { System.out.print(format.array[i]); i++; } else { i++; switch(format.array[i]) { case 'd': { if(arguments.length <= argumentIndex) throw new StringIndexOutOfBoundsException(argumentIndex); try { System.out.print((Integer) arguments[argumentIndex]); }catch (ArrayIndexOutOfBoundsException exception) { throw new StringIndexOutOfBoundsException(argumentIndex); } argumentIndex++; } break; case 'f': { if(arguments.length <= argumentIndex) throw new StringIndexOutOfBoundsException(argumentIndex); try { System.out.print((Double) arguments[argumentIndex]); }catch (ArrayIndexOutOfBoundsException exception) { throw new StringIndexOutOfBoundsException(argumentIndex); } argumentIndex++; } break; case 'l': { if(arguments.length <= argumentIndex) throw new StringIndexOutOfBoundsException(argumentIndex); try { System.out.print((Long) arguments[argumentIndex]); }catch (ArrayIndexOutOfBoundsException exception) { throw new StringIndexOutOfBoundsException(argumentIndex); } argumentIndex++; } break; case 'c': { if(arguments.length <= argumentIndex) throw new StringIndexOutOfBoundsException(argumentIndex); try { System.out.print((char) arguments[argumentIndex]); }catch (ArrayIndexOutOfBoundsException exception) { throw new StringIndexOutOfBoundsException(argumentIndex); } argumentIndex++; } break; case 's': { if(arguments.length <= argumentIndex) throw new StringIndexOutOfBoundsException(argumentIndex); try { System.out.print((String) arguments[argumentIndex]); }catch (ArrayIndexOutOfBoundsException exception) { throw new StringIndexOutOfBoundsException(argumentIndex); } argumentIndex++; } break; } } } else { System.out.print(format.array[i]); } } } public char charAt(int index) { if((index < 0) || (index >= array.length)) throw new StringIndexOutOfBoundsException(index); return array[index]; } public MyString concat(MyString value) { int length = this.array.length + value.array.length; char[] temp = new char[length]; for(int i = 0; i < this.array.length; i++) temp[i] = this.array[i]; for(int i = 0; i < value.array.length; i++) temp[this.array.length + i] = value.array[i]; return new MyString(temp); } public void display() { System.out.println(array); // for(int i = 0; i < this.array.length; i++) { // if(array[i] == '\n') { // break; // }else { // System.out.format("%c", array[i]); // } // } // System.out.println(""); } public int length() { return length; } public void setAt(int index, char c) { if(index < 0) throw new StringIndexOutOfBoundsException(index); if(index > length) throw new StringIndexOutOfBoundsException(index); array[index] = c; } public MyString subString(int low, int high) { if(low < 0) { // System.out.println(length); // System.out.println(low); low = length + low; // System.out.println(low); high+=low; // System.out.println(high); if(high > length -1) { high=length-1; // System.out.println(high); } } if(low < 0) throw new StringIndexOutOfBoundsException(low); if(high > length) throw new StringIndexOutOfBoundsException(high); if(low > high) throw new StringIndexOutOfBoundsException(high - low); MyString result = new MyString(); result.length = high - low + 1; result.array = new char[result.length]; for(int i = 0; i < result.length; i++) result.array[i] = this.array[low + i]; return result; } public MyString subString(int low) { if(low < 0) low = length + low; int high = length-1; if(low < 0) throw new StringIndexOutOfBoundsException(low); if(low > high) throw new StringIndexOutOfBoundsException(high - low); MyString result = new MyString(); result.length = high - low + 1; result.array = new char[result.length]; for(int i = 0; i < result.length; i++) result.array[i] = this.array[low + i]; return result; } public char[] toCharArray() { return array; } public boolean startsWith(MyString prefix) { return startsWith(prefix, 0); } public boolean startsWith(String prefix) { return startsWith(new MyString(prefix), 0); } public boolean startsWith(String prefix, int offset) { return startsWith(new MyString(prefix), offset); } public boolean startsWith(MyString prefix, int offset) { int to = offset; char pa[] = prefix.toCharArray(); int po = 0; int pc = prefix.length(); if((offset < 0) || (offset > length() - pc)) { return false; } while(--pc >= 0) { if (array[to++] != pa[po++]) { return false; } } return true; } // public boolean endsWith(String suffix, index offset) { public boolean endsWith(String suffix) { int start = length() - suffix.length(); if(start >= 0) { return indexOf(suffix, start) >= 0; } return false; } public boolean endsWith(char[] search) { return endsWith(String.copyValueOf(search)); } //count: second string is in the first public int count(char[] search) { return count(new MyString(search)); } public int count(String search) { return count(search.toCharArray()); } public int count(MyString search) { int counter=0; int i=-1; i=indexOf(search, i+1); while(i!=-1) { i=indexOf(search, i+1); counter++; } return counter; } public MyString replaceAndUpdate(String search, String replace) { return replaceAndUpdate(new MyString(search), new MyString(replace)); } public MyString replaceAndUpdate(MyString search, MyString replace) { MyString temp=replace(search, replace); this.array=temp.array; this.length=temp.length; return temp; } public MyString replace(String search, String replace) { return replace(new MyString(search), new MyString(replace)); } public MyString replace(MyString search, MyString replace) { return replace(search, replace, 0); } public MyString replace(String search, String replace, int limit) { return replace(new MyString(search), new MyString(replace), limit); } public MyString replaceFirst(MyString search, MyString replace) { return replace(search, replace, 1); } public MyString replaceFirst(String search, String replace) { return replace(new MyString(search), new MyString(replace), 1); } public MyString replace(MyString search, MyString replace, int limit) { // char[] searchArr = search.toCharArray(); // char[] replaceArr = replace.toCharArray(); // int numTimes = count(searchArr); // // System.out.println(numTimes); // char[] strResult = new char[length + Math.abs(numTimes*(replaceArr.length-searchArr.length))]; // System.arraycopy(array, 0, strResult, 0, array.length); // MyString temp = new MyString(strResult); // temp.display(); // return temp; StringBuilder sb = null; int start = 0; int did=0; for(int i; (i = indexOf(search, start)) != -1; ) { if(sb == null) sb = new StringBuilder(); sb.append(new String(this.array), start, i); sb.append(replace); start = i + search.length(); did++; if(did == limit) { break; } } if(sb == null) return this; sb.append(new String(this.array), start, length); return new MyString(sb.toString()); // MyString temp = new MyString(sb.toString()); // return temp; } public MyString replaceAndUpdate(char oldChar, char newChar) { MyString s=new MyString(replace(oldChar, newChar)); this.array=s.array; this.length=s.length; return this; } public MyString replace(char oldChar, char newChar) { if(oldChar != newChar) { int len = length; int i = -1; while(++i < len) { if(array[i] == oldChar) { break; } } if(i < len) { char buf[] = new char[len]; for(int j = 0; j < i; j++) { buf[j] = array[j]; } while(i < len) { char c = array[i]; buf[i] = (c == oldChar) ? newChar : c; i++; } MyString s=new MyString(buf); return s; } } return this; } }
X Tutup