Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
| public class Algoritm { public static char[] replace(char[] aSource, String aOld, String aNew) { final int tSourceLength = aSource.length; if(tSourceLength == 0) //Zonder source doen we niks natuurlijk... return aSource; final int tOldStringLength = aOld.length(); if(tOldStringLength == 0) //En ook niet als er niks te vervangen is return aSource; final int tNewStringLength = aNew.length(); final char[] tOld = aOld.toCharArray(); final char[] tNew = aNew.toCharArray(); final int[] tFound = find(aSource, tOld); //Vind alle plaatsen waar je de string moet vervangen final int tFoundLength = tFound.length; int index = 0; int sourcePos = 0; int resultPos = 0; int length; char[] result = new char[(tSourceLength + (tFoundLength * (tNewStringLength - tOldStringLength)))]; //Dit is het resultaat met de juiste grootte while(index < tFoundLength) //Loop door alle plaatsen heen waar je wat moet vervangen { length = tFound[index]-sourcePos; //Lengte van het stukje dat uit het origineel moet gekopiëerd worden System.arraycopy(aSource, sourcePos, result, resultPos, length); //En kopiëer dat resultPos += length; //De positie in de resultaatstring gaat met die lengte omhoog sourcePos += length + tOldStringLength; //En de positie in de sourcestring gaat met de lengthe plus het te vervangen omhoog System.arraycopy(tNew, 0, result, resultPos, tNewStringLength); //Plaats daarna op de juiste plaat de nieuwe string resultPos += tNewStringLength; //En verhoog de positie van de resultaatstring weer. index++; } System.arraycopy(aSource, sourcePos, result, resultPos, result.length-resultPos); //Voeg de rest aan het eind toe return result; } public static int[] find(char[] aSource, char[] aFind) { final int tSourceLength = aSource.length; if(tSourceLength == 0) return new int[0]; final int tFindLength = aFind.length; if(tFindLength == 0) return new int[0]; int index = 0; int[] temp = new int[(tSourceLength/tFindLength)]; //Het maximaal aantal te vinden keer is //de lengte van de source gedeelt door de lengte van het te vinden int nrFound = 0; while(index < tSourceLength) //Doorzoek de hele sourceString { if((aSource[index] == aFind[0]) && (isFound(aSource, index+1, aFind, 1)) ) //Als het eerste teken overeenkomt, en de rest ook { temp[nrFound++] = index; //Dan hebben we hier eentje gevonden index += tFindLength; } else index++; //Anders zoeken we de volgende } int[] result = new int[nrFound]; //Het resultaat is kleiner dan temp, tenminste meestal ;) System.arraycopy(temp, 0, result, 0, nrFound); return result; } private static boolean isFound(char[] aSource, int index, char[] aFind, int findIndex) { if(findIndex >= aFind.length) //Als de index als gelijk of groter is dan de lengte, dan zitten we erdoorheen return true; //Dus kunnen we true terug geven. if(index >= aSource.length) //Als we door de source heen zijn, dan geven we false return false; if(aSource[index] == aFind[findIndex]) //Als het huidige teken van de source gelijk is aan die van de zoekstring return isFound(aSource, index+1, aFind, findIndex+1); //Dan vragen we recursief de volgende aan. Tot het eind... else return false; //Is die niet gelijk, dan returnen we false. } } |
veel beter krijg ik hem niet...