Estoy tratando de crear fragmentos de una cadena en múltiples delimitadores. Por ejemplo, tengo la siguiente cadena.
Leucemia linfocítica crónica :: linfoma linfocítico pequeño
Tengo que dividir la cadena primero en base a este delimitador ::
Esa parte es fácil.
El de cada una de las subcadenas (Term) Necesito para generar fragmentos en base a la siguiente regla
Un término compuesto de las palabras A, B y C, es decir, 'ABC' se fragmenta en 'ABC' (0), 'AB' (1), 'BC' (2), 'A' (3), 'B' (4), 'C' (5)
Una longitud término no es fijo. Puede ser tres palabras o más o menos.
lógica es que cada palabra en el término sólo debe concatena con las siguientes palabras en la matriz en una lógica de las ventanas de contracción. Así primera palabra es una y tiene AC después de ella. Así combinación será AB C y luego se encoge ventana de derecha a izquierda así que la próxima Combo será AB y el próximo será C.
Por tanto en caso de un término ABCD los fragmentos de salida será
'ABC D'
'AB C',
'A B',
'A',
'BC D',
'B C',
'B',
'C D',
'C',
'D'
y en caso de un ABCDE término los fragmentos de salida será
'ABCD E', 'ABC D', 'AB C', 'A B', 'A', 'BCD E', 'BC D', 'antes de Cristo,' B', 'CD E', 'C D' , 'C', 'D E', 'D', 'E'
En las anteriores "leucemia linfocítica crónica" y "linfoma linfocítico pequeño" son dos términos.
La salida de necesidad leucemia linfocítica crónica que es
La leucemia linfocítica crónica
linfocítica crónica
crónica
leucemia linfocítica
linfocítica
Leucemia
Estoy tratando de dividir esto en una matriz 2D y luego iterar a través de ellos y tratar de concatenar ellos, pero yo estoy golpeando un obstáculo en el camino
String str="Chronic Lymphocytic Leukemia :: Small Lymphocytic Lymphoma";
String[] rows=str.split("::");
String[][] table=new String[rows.length][];
for (int i=0; i<rows.length;i++)
{
table[i]=rows[i].split(" ");
}
for (int i=0;i<table.length;i++)
{
for(int j=0;j<table[i].length;j++)
{
System.out.println(table[i][j]);
}
}
Alguna idea de cómo puedo lograr esto
Casi en línea recta hacia adelante:
- un bucle que selecciona la primera palabra;
- un segundo bucle dentro de la primera uno que selecciona la palabra final, yendo hacia atrás.
- dentro de ese bucle sólo tiene que unirse a las palabras un complemento al resultado
Algo como:
List<String> fragments(String[] words) {
var result = new ArrayList<String>();
for (var i = 0; i < words.length; i++) {
for (var j = words.length; j > i; j--) {
result.add(Arrays.stream(words, i, j).collect(Collectors.joining(" ")));
}
}
// result.remove(0); // if you don't want the whole sequence inside the result
return result;
}
Si, por alguna razón, stream
no es una opción, es necesario un tercer bucle para recoger las palabras:
List<String> fragments(String[] words) {
var result = new ArrayList<String>();
for (var i = 0; i < words.length; i++) {
for (var j = words.length; j > i; j--) {
var fragment = new StringBuilder();
for (var k = i; k < j; k++) {
if (k > i) {
fragment.append(" ");
}
fragment.append(words[k]);
}
result.add(fragment.toString());
}
}
// result.remove(0); // if you dont want the whole sequence inside the result
return result;
}