Dividir cadena en función de ventana deslizante Shrinking gama / 2D

Junaid388:

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

user85421:

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, streamno 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;
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=235152&siteId=1
Recomendado
Clasificación