ciao,
vi espongo brevemente quello che dovrei fare :dati due array di stringhe,(ad esempio)
I1:[j11,j21]
I2:[j12,j22,j32]
j11=abcd
j21=abc
----------
j12=abd
j22=bcd
j32=adc
devo trovare la max lunghezza sottostringa comune tra ogni coppia di stringhe: (e fin qui tutto ok!!)
nel mio caso:
MSC(J11,J12)=2
MSC(J11,J22)=3
MSC(J11,J32)=1
MSC(J21,J12)=2
MSC(J21,J22)=2
MSC(J21,J32)=1
quindi dopo aver trovato le max lunghezze per ogni coppia ,devo ordinare le stringhe nei due array seguendo l'ordine dato dalle lunghezze delle sottostringhe trovate dal piu piccolo valore al piu grande,ad esempio nel mio caso la piu piccola lunghezza(1) si trova in corrispondenza di MSC(J21,J32)=1,quindi inserisco in prima posizione j21 in I1 e j32 in I2 e cosi via fino ad orninare tutte le stringhe..,inoltre le stringhe vanno inserite a coppia nel senso che per ogni coppia se una o entrambe le stringhe sono già stata inserite in uno o entrambi gli array che sto ordinando questa coppia non deve essere inserita..infatti nel mio caso non considero le coppie MSC(J21,J12)=2 e MSC(J21,J22)=2 che dovrei mettere in seconda posizione poichè j21 è gia nell'array I1
quindi il risultato finale dovrebbe essere:
I1= j21 j11
I2= j32 j12 j22
quello che avevo in mente io era questo: trovare la max lunghezza tra la prima coppia di stringhe,quindi inserire queste stringhe negli array,il passo successivo:considerare la successiva coppia e trovare il rispettivo max,confrontare questo nuovo max con il precedente max,se il max attuale è maggiore del precedente allora inserisco le stringhe corrispondenti al max attuale in posizione successiva a quelle gia inserite,mentre se il max corrente è minore del max precedente inserisco le stringhe in posizione precedente a quelle gia inserite...
sto provando a implementare questo algoritmo ma con non poche difficoltà e scarso successo,questo il mio codice che non credo sia molto corretto,infatti non mi ritorna quello che dovrebbe:
codice:
public class Ordinamento {
public static int longestCommonSubstring(String str1, String str2){
if((str1==null && str1.length()==0) || (str2==null && str2.length()==0))
return 0;
int[][] num = new int[str1.length()][ str2.length()];
int maxlen = 0;
for (int i = 0; i < str1.length();i++){
for (int j = 0; j < str2.length(); j++){
if (str1.charAt(i) != str2.charAt(j))
num[i][ j] = 0;
else{
if ((i == 0) || (j == 0))
num[i][ j] = 1;
else
num[i][ j] = 1 + num[i - 1][ j - 1];
if (num[i][ j] > maxlen){
maxlen = num[i][j];
}
}
}
}
return maxlen;
}
/*verifica se le stringhe sono uguali*/
public static boolean uguali(String a,String b){
boolean uguali;
if(a.length()== b.length()) {
uguali = true;
int i = 0;
while(uguali && i<a.length()) {
if(a.charAt(i) != b.charAt(i))
uguali = false;
i = i+1;
}
}
else /*se t hanno lunghezza diversa, quindi sono diverse */
uguali = false;
return uguali;
}
public static void ordinamento1(String[]I1,String[]I2){
int i, j, max;
//int [] maxLunghezzaSottostringa= new int [arrayI1.length * arrayI2.length];
String [] arrayI1= new String [I1.length];
String [] arrayI2= new String [I2.length];
for(i=0;i<arrayI1.length;i++)
arrayI1[i]=" ";
for(i=0;i<arrayI2.length;i++)
arrayI2[i]=" ";
int maxLunghezzaSottostringa=0;
max=-1;
for(i= 0;i<I1.length;i++){
for(j= 0;j<I2.length;j++){
maxLunghezzaSottostringa=longestCommonSubstring(I1[i],I2[j]);
System.out.println(maxLunghezzaSottostringa+" ");
String stringaI1=I1[i];
String stringaI2=I2[j];
if(maxLunghezzaSottostringa>=max){
for(i=0;i<arrayI1.length;i++){
boolean stringheUguali;
stringheUguali=uguali(arrayI1[i],stringaI1);
if(stringheUguali==false &&( stringaI2!=arrayI1[i]))
arrayI1[i]=stringaI1;
stringheUguali=uguali(arrayI1[i],stringaI2);
if(stringheUguali==false &&(stringaI1!=arrayI1[i]))
arrayI1[i]=stringaI2;
}
for(j=0;j<arrayI2.length;j++){
boolean stringheUguali;
stringheUguali=uguali(arrayI2[j],stringaI1);
if(stringheUguali==false && (stringaI2!=arrayI2[i]))
arrayI2[j]=stringaI1;
stringheUguali=uguali(arrayI2[j],stringaI2);
if(stringheUguali==false && (stringaI1!=arrayI2[i]))
arrayI2[j]=stringaI2;
}
max=maxLunghezzaSottostringa;
}
else{
for(i=0;i<arrayI1.length;i++){
boolean stringheUguali;
stringheUguali=uguali(arrayI1[i],stringaI1);
if(stringheUguali==false &&( stringaI2!=arrayI1[i]))
//sposto gli elementi dell'array di una posizione a destra
for(i=0;i<arrayI1.length;i++){
arrayI1[i+1]=arrayI1[i];
}
arrayI1[i]=stringaI1;
stringheUguali=uguali(arrayI1[i],stringaI2);
if(stringheUguali==false &&(stringaI1!=arrayI1[i]))
for(i=0;i<arrayI1.length;i++){
arrayI1[i+1]=arrayI1[i];
}
arrayI1[i]=stringaI2;
}
for(j=0;j<arrayI2.length;j++){
boolean stringheUguali;
stringheUguali=uguali(arrayI1[j],stringaI1);
if(stringheUguali==false && (stringaI2!=arrayI1[i]))
for(i=0;i<arrayI2.length;j++){
arrayI1[j+1]=arrayI1[j];
}
arrayI1[j]=stringaI1;
stringheUguali=uguali(arrayI1[j],stringaI2);
if(stringheUguali==false && (stringaI1!=arrayI1[i]))
for(i=0;i<arrayI2.length;j++){
arrayI1[j+1]=arrayI1[j];
}
arrayI1[j]=stringaI2;
}
}
}
for(j=0;j<arrayI2.length;j++){
System.out.println(arrayI2[j]+" ");
}
for(i=0;i<arrayI1.length;i++){
System.out.println(arrayI1[i]+" ");
}
}
}
}
codice:
public static void main(String[] args) {
String[] arrayI1 = new String[]{"abcd","abc"};
String[] arrayI2 = new String[]{"abd","bcd","adc"};
Ordinamento.ordinamento1(arrayI1, arrayI2);
quello che mi stampa è molto diverso da quello che io vorrei:
2
abd
abd
abcd
abcd
abcd
qualcuno mi può dare una mano,grazie!!