jovan1982 Jovo Krneta ekonomista Novi Banovci
Član broj: 290143 Poruke: 76 *.ptt.rs.
Sajt: www.bar-codes.org
|
Evo verujem da je ovo resenje problema , u vecini slucajeva - i onih komplaksnijih koje sam testirao dobio sam ok rezultate .
*Prvo se radi identifikovanje pisma da li je u pitanju latinica ili cirilica .
*Zatim se slogovi dele posle samoglasnika
*Ukoliko tako podeljena slogovi imaju u sebi suglasnike jedan do drugog oni se premestaju u prethodni slog
//glavna klasa
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package lang;
import java.util.ArrayList;
import java.util.Arrays;
import static lang.Pismo.Cyr;
import static lang.Pismo.Lat;
/**
*
* @author Jovo
*/
public class Slog {
final String samoglasniciL="a,e,i,o,u";
final String sonatiL="j,v,r,m,l,lj,n,nj";
final String slogotvorniSonatiL="r,l,n";
final String suglasniciL="b,v,g,d,đ,dj,ž,z,j,k,l,lj,m,n,nj,p,r,s,t,ć,f,h,c,č,dž,š";
final String konsonantiL="b,g,d,z,ž,đ,dž,p,k,t,s,š,ć,č,h,f,c";
final String zvucniKonsonantiL="b,g,d,z,ž,đ,dž";
final String bezZvucniKonsonantiL="p,k,t,s,š,ć,č,h,f,c";
final String samoglasniciC="a,e,i,o,u";
final String sonatiC="j,v,r,m,l,lj,n,nj";
final String slogotvorniSonatiC="r,l,n";
final String suglasniciC="b,v,g,d,đ,dj,ž,z,j,k,l,lj,m,n,nj,p,r,s,t,ć,f,h,c,č,dž,š";
final String konsonantiC="b,g,d,z,ž,đ,dž,p,k,t,s,š,ć,č,h,f,c";
final String zvucniKonsonantiC="b,g,d,z,ž,đ,dž";
final String bezZvucniKonsonantiC="p,k,t,s,š,ć,č,h,f,c";
Pismo p;
private String rec;
private String slovo;
private StringBuilder recPodeljenaNaSlogove=new StringBuilder();
public void setRec(String r)
{
this.rec=r;
if(isCyrilic(this.rec))
p=Cyr;
else
p=Lat;
}
public String getRec()
{
return this.rec;
}
public Slog()
{
}
private boolean isCyrilic(String word)
{
int latCounter=0;
int cyrCounter=0;
char c;
for (int i = 0; i < word.length(); i++) {
c=word.charAt(i);
if(Character.UnicodeBlock.CYRILLIC.equals(Character.UnicodeBlock.of(c)))
{
cyrCounter++;
}
else
{
latCounter++;
}
if(latCounter>cyrCounter)
return false;
else
return true;
}
return true;
}
public boolean isSamoglasnikL(String s)
{
if(samoglasniciL.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}
public boolean isSonatL(String s)
{
if(sonatiL.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}
public boolean isSlogotvorniSonatiL(String s)
{
if(slogotvorniSonatiL.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}
public boolean isSuglasnikL(String s)
{
if(suglasniciL.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}
public boolean isKonsonantiL(String s)
{
if(konsonantiL.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}
public boolean isZvucniKonsonantiL(String s)
{
if(zvucniKonsonantiL.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}
public boolean isBezZvucniKonsonantiL(String s)
{
if(bezZvucniKonsonantiL.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}
public boolean isSamoglasnikC(String s)
{
if(samoglasniciC.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}
public boolean isSonatC(String s)
{
if(sonatiC.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}
public boolean isSlogotvorniSonatiC(String s)
{
if(slogotvorniSonatiC.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}
public boolean isSuglasnikC(String s)
{
if(suglasniciC.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}
public boolean isKonsonantiC(String s)
{
if(konsonantiC.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}
public boolean isZvucniKonsonantiC(String s)
{
if(zvucniKonsonantiC.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}
public boolean isBezZvucniKonsonantiC(String s)
{
if(bezZvucniKonsonantiC.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}
public String podeliNaSlogovePoSamoglasnicima()
{
/*
prvobitna podela reci na slogove gde se rec
na slogove deli samo po samoglasnicima
*/
//ukoliko je rac od 3 slova ili manje nemoj je rastavljati vrati celu rec
if(this.rec.length()<=3)
return this.rec;
char c;
for (int i = 0; i < this.rec.length(); i++) {
c=this.rec.charAt(i);
slovo=String.valueOf(c);
recPodeljenaNaSlogove=recPodeljenaNaSlogove.append(c);
if(this.p==Cyr)
{
if(isSamoglasnikC(slovo) && i<this.rec.length()-2)
recPodeljenaNaSlogove=recPodeljenaNaSlogove.append("-");
}
else
{
if(isSamoglasnikL(slovo) && i<this.rec.length()-2)
recPodeljenaNaSlogove=recPodeljenaNaSlogove.append("-");
}
}
return podeliNaSlogovePoSuglasnicima(this.recPodeljenaNaSlogove.toString());
}
private String podeliNaSlogovePoSuglasnicima(String prethodnoPodeljenoPoSamoglasnicima)
{
/*
ponovno deljenje vec podeljene reci po suglasnicima
kako bi smo identifikovali pogresno podeljene slogove
u kojima su ostali suglasnici jedan do drugug
*/
String[] t=prethodnoPodeljenoPoSamoglasnicima.split("-");
String iznovaDeljeno="";
for (int i = 1;i < t.length; i++) {
char c;
/*proveraj mi samo one slogove koji imaju 2 slova i vise
da li u tim slogovima postoje suglasnici koji su spojeni ako
postoje razdvojiti ih tako da ne budu u istom slogu*/
if(t.length()>=2)
{
if(this.p == Cyr)
{
/*ukoliko su u slogu dve suglasnika jedan do drugog
prebaci prvi suglasnik u prethodni slog za cirilicu*/
if(isSuglasnikC(t.substring(0, 1)) && isSuglasnikC(t.substring(1, 2)))
{
t[i-1]=t[i-1]+t.substring(0, 1);
t= t.substring(1, t.length());
}
}
else
{
/*ukoliko su u slogu dve suglasnika jedan do drugog
prebaci prvi suglasnik u prethodni slog za latinicu*/
if(isSuglasnikL(t.substring(0, 1)) && isSuglasnikL(t.substring(1, 2)))
{
t[i-1]=t[i-1]+t.substring(0, 1);
t= t.substring(1, t.length());
}
}
}
}
for (int i = 0; i < t.length; i++) {
iznovaDeljeno=iznovaDeljeno+t;
if(i!=t.length-1)
iznovaDeljeno=iznovaDeljeno+"-" ;
}
return iznovaDeljeno;
}
}
//enum koji se koristi za pismo
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package lang;
/**
*
* @author Jovo
*/
public enum Pismo {
Lat,Cyr
}
//implementacija
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package lang;
import javax.swing.JOptionPane;
/**
*
* @author jkrne
*/
public class Lang {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
String rec="";
while(!rec.equalsIgnoreCase("x"))
{
rec=JOptionPane.showInputDialog("Unesite rec za analizu ili X za prekid rada aplikacije");
if(rec==null)
{
JOptionPane.showMessageDialog(null, "Prijatan dan!");
return;
}
String podeljeno="";
Slog w= new Slog();
w.setRec(rec);
podeljeno= w.podeliNaSlogovePoSamoglasnicima();
if(!podeljeno.equalsIgnoreCase("x"))
{
JOptionPane.showMessageDialog(null, podeljeno);
}
else
JOptionPane.showMessageDialog(null, "Prijatan dan!");
}
//System.out.println(podeljeno);
// TODO code application logic here
}
}
Probajte malo i sami ako imate vremena pa mi kazite sta mislite :-)
P.S. Sam EliteSecurity mi je izmenio ćirilične konstante u latinične u kodu su konstante sa velikim C pisane u cirilici .
Ove na početku
final String samoglasniciC="a,e,i,o,u";
final String sonatiC="j,v,r,m,l,lj,n,nj";
final String slogotvorniSonatiC="r,l,n";
final String suglasniciC="b,v,g,d,đ,dj,ž,z,j,k,l,lj,m,n,nj,p,r,s,t,ć,f,h,c,č,dž,š";
final String konsonantiC="b,g,d,z,ž,đ,dž,p,k,t,s,š,ć,č,h,f,c";
final String zvucniKonsonantiC="b,g,d,z,ž,đ,dž";
final String bezZvucniKonsonantiC="p,k,t,s,š,ć,č,h,f,c";
u kodu se pišu ćiriličnim slovima ...
Pozdrav!
[Ovu poruku je menjao jovan1982 dana 06.09.2014. u 23:48 GMT+1]
|