/** * Verilen kök icerigini aðaca ekler. * * @param icerik * @param kok */ public void ekle(String icerik, Kok kok) { //System.out.println("Kelime: " + icerik); char[] hd = icerik.ToCharArray(); KokDugumu node = baslangicDugumu; KokDugumu oncekiDugum = null; int idx = 0; // null alt düðüm bulana dek veya kelimenin sonuna dek alt düðümlerde ilerle while (idx < hd.Length) { oncekiDugum = node; node = node.altDugumGetir(hd[idx]); if (node == null) { break; } idx++; } /** * Aðaç üzerinde ilerlerken kelimemizin sonuna kadar gitmiþiz. * kelimemizi bu düðüme ekleriz. * Örneðin * i-s-t-->istim þeklindeki dala "is" kelimesini eklemek gibi. * i-s-t-->istim * |-->is * * veya * * i-s-->istim e is gelirse de * i-s-t-->istim * |-->is * * i-s-->is e "is" gelirse * i-s-->is(2) olmalý. * */ if (idx == hd.Length) { if (node.altDugumVarMi()) { node.kokEkle(kok); node.setKelime((IEnumerable <char>)icerik); } // Eþ sesli! else if (node.getKelime().Equals(icerik)) { node.kokEkle(kok); return; } else if (node.getKok() != null) { //TODO : Burada charenumerable'dan son chari oldukça kazma bir yöntemle alýyoruz. Bunu incelemek lazým. KokDugumu aNewNode = node.addNode(new KokDugumu(node.getKelime().ToString().ToCharArray()[idx])); aNewNode.kopyala(node); node.temizle(); node.kokEkle(kok); node.setKelime(icerik); } return; } /** * Kaldýðýmýz düðüme baðlý bir kök yoksa bu kök için bir düðüm oluþturup ekleriz. */ if (oncekiDugum.getKok() == null && idx < hd.Length) { oncekiDugum.addNode(new KokDugumu(hd[idx], icerik, kok)); return; } if (oncekiDugum.getKelime().Equals(icerik)) { oncekiDugum.kokEkle(kok); return; } /** * Düðümde duran "istimlak" ve gelen kök = "istimbot" için, * i-s-t-i-m * e kadar ilerler. daha sonra "istimlak" için "l" düðümünü oluþturup kökü baðlar * i-s-t-i-m-l-->istimlak * sonra da diðer düðüm için "b" düðümünü oluþturup gene "m" düðümüne baðlar * i-s-t-i-m-l-->istimlak * |-b-->istimbot * * Eðer istimlak düðümü baðlanmýþsa ve "istim" düðümü eklenmek üzere * elimize gelmiþe * i-s-t-i-m-l-->istimlak * tan sonra istim, "m" düðümüne doðrudan baðlanýr. * i-s-t-i-m-l-->istimlak * |-->istim * */ char[] nodeHd = ((String)oncekiDugum.getKelime()).ToCharArray(); //char[] nodeChars = ((String) oncekiDugum.getKelime()).toCharArray(); KokDugumu newNode = oncekiDugum; if (idx == nodeHd.Length) { newNode.addNode(new KokDugumu(hd[idx], icerik, kok)); return; } //TODO : Ayný kazmalýk, kelimenin boyunu alýrken, hepsi CharSequence yüzünden if (oncekiDugum.getKelime().ToString().Length == idx) { newNode.addNode(new KokDugumu(hd[idx], icerik, kok)); return; } if (nodeHd.Length <= hd.Length) { while (idx < nodeHd.Length && nodeHd[idx] == hd[idx]) { newNode = newNode.addNode(new KokDugumu(nodeHd[idx])); idx++; } // Kisa dugumun eklenmesi. if (idx < nodeHd.Length) { KokDugumu temp = newNode.addNode(new KokDugumu(nodeHd[idx])); temp.kopyala(oncekiDugum); } else { newNode.kopyala(oncekiDugum); } // Uzun olan dugumun (yeni gelen) eklenmesi, es anlamlilari kotar newNode.addNode(new KokDugumu(hd[idx], icerik, kok)); oncekiDugum.temizle(); //Tankut Java-R42 ile silindi. return; } /** * * Eðer köke önce "istimlak" ve sonra "istifa" gelirse * i-s-t-i-m-l-->istimlak * daha sonra gene son ortak harf olan "i" ye "f" karakterli düðümü * oluþturup istifayý baðlar * istimlak ta "m" düðümüne baðlý kalýr. * i-s-t-i-m-->istimlak * |-f-->istifa * */ else { while (idx < hd.Length && hd[idx] == nodeHd[idx]) { newNode = newNode.addNode(new KokDugumu(hd[idx])); idx++; } // Kisa dugumun eklenmesi. if (idx < hd.Length) { newNode.addNode(new KokDugumu(hd[idx], icerik, kok)); } else { newNode.kokEkle(kok); newNode.setKelime(icerik); } // Uzun olan dugumun (yeni gelen) eklenmesi. newNode = newNode.addNode(new KokDugumu(nodeHd[idx])); newNode.kopyala(oncekiDugum); // Es seslileri tasi. oncekiDugum.temizle(); //Tankut Java-R42 ile silindi. return; } }