/*
* Lisans bilgisi icin lutfen proje ana dizinindeki zemberek2-lisans.txt dosyasini okuyunuz.
*/
package net.zemberek.yapi;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import net.zemberek.yapi.ek.Ek;
/**
* Bu sinif rasgele bir sirada gelen ek ve kok bilgisini kullanarak olasi dogru ek dizilimlerini uretir
*
* aakin,Sep 6, 2005
*/
public final class EkSiralayici {
private final List> tumOlusumlar=new ArrayList>();
private final List ekler;
private final Ek baslangicEki;
private final int tum;
public EkSiralayici(List ekler, Ek baslangicEki) {
this.ekler = ekler;
this.baslangicEki = baslangicEki;
this.tum = ekler.size();
}
/**
* olasi dogru ek dizilimlerini bulur.
*
* @return List> Her bir dogru ek dizilimi bir listede tutulur. Donus ise tum dogru
* ek dizilim listelerini tutan baska bir liste. Eger liste bos ise dogru dizilim bulunamamis demektir.
*/
public List> olasiEkDizilimleriniBul() {
if (ekler == null)
return Collections.emptyList();
List kopya = new ArrayList(ekler);
yuru(new ArrayList(), baslangicEki, kopya);
return tumOlusumlar;
}
/**
* Bu metod rasgele girilen bir ek dizisinin olasi dogru siralamalarini bulur.
* Metod kendi kendini cagiran bir yapidadir (recursive). Sonucta dogru olabilecek dizilimler
* nesne icindeki "tumOlusumlar" dizisine atilir.
*
* @param olusan: ic calisma sirasinda dogru olusan dizilimi tasiyan ArrayList.
* @param incelenenEk: Kok'un tipine gore gereken baslangic eki. FIIL ise FIIL_YALIN vs.
* @param rasgeleEkler: rasgele sirali ekleri tasiyan liste.
*/
private void yuru(List olusan, Ek incelenenEk, List rasgeleEkler) {
for (int i = 0; i < rasgeleEkler.size(); i++) {
Ek ek = rasgeleEkler.get(i);
if (incelenenEk.ardindanGelebilirMi(ek)) {
List newList = new ArrayList(rasgeleEkler);
newList.remove(i);
olusan.add(ek);
if (newList.size() != 0)
yuru(olusan, ek, newList);
}
}
if (olusan.size() == tum) {
if (!this.tumOlusumlar.contains(olusan))
this.tumOlusumlar.add(olusan);
} else {
rasgeleEkler.add(incelenenEk);
if (olusan.size() > 0)
olusan.remove(olusan.size() - 1);
}
}
}