基于收缩滑动窗口/ 2D数组的分割字符串

时间:2019-08-12 13:23:45

标签: java arrays

我正在尝试在多个定界符上创建A字符串的片段。 例如,我有以下字符串。

慢性淋巴细胞性白血病::小淋巴细胞性淋巴瘤

我需要首先基于此定界符分割字符串::

那部分很简单。

我需要根据以下规则从每个子字符串(术语)生成片段

由单词A,B和C组成的术语,即“ A B C”被分为 'A B C'(0),'A B'(1),'B C'(2),'A'(3),'B'(4),'C'(5)

任期长度不是固定的。它可以是三个字或更多或更少。

逻辑上,在缩小窗口逻辑中,术语中的每个单词只能与数组中的下一个单词连接。因此,第一个单词是A,之后是BC。因此,组合将为A BC。然后窗口从右向左收缩,因此下一个Combo将为A B,下一个将为C。

因此,如果使用术语A B C D,则输出片段为

'A B C D'
'A B C',
'A B',
'A',
'B C D',
'B C',
'B',
'C D',
'C',
'D'

,如果使用术语A B C D E,则输出片段为

'ABCD E','ABC D','AB C','A B','A','BCD E','BC D','BC,'B','CD E',' C D','C','D E','D','E'

在上面的“慢性淋巴细胞性白血病”和“小淋巴细胞性淋巴瘤”中是两个术语。

我需要的慢性淋巴细胞白血病的输出是

慢性淋巴细胞白血病
慢性淋巴细胞
慢性
淋巴细胞白血病
淋巴细胞
白血病

我正在尝试将其拆分为2D数组,然后遍历它们并尝试将它们连接起来,但是我遇到了障碍

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]);
      }
  }

关于如何实现这一目标的任何想法

3 个答案:

答案 0 :(得分:1)

这是答案

bash-4.2$ ftp 10.184.6.27
Connected to 10.184.6.27 (10.184.6.27).
220 - Copyright(c) 2000-2019 Ciena (R) Corporation - All Rights Reserved - This is a private computer system. Unauthorized access or use may lead to prosecution.
Name (10.184.6.27:sohani): DESIGN
331 Password required for user DESIGN
Password:
230 Login OK
Remote system type is UNIX.
Using binary mode to transfer files.

预期结果如下。

import java.util.*;

public class MyClass {
    public static void main(String args[]) {
      String[] array= {"a","b","c","d", "e"};
      HashSet<String> result = new HashSet<>(); 

       for (int i=0; i<array.length  ; i++){ 

           addWords(array, i, result);
       }
    }

    public static void addWords(String[]array, int n, Set<String> result){
         int wordSize = array.length - n;
         //need to loop wordSize number of times.
        int numberOfLoops = array.length -wordSize +1 ;

         System.out.println("Handling n="+n+" wordsize="+wordSize+", numLoops="+numberOfLoops);

         for (int i = 0; i< numberOfLoops; i++){
             String word ="";
             for(int j = i; j<wordSize+i; j++){
                 word+=array[j]+" ";
             } 
             result.add(word.trim());

             System.out.println("Adding: "+ word);
         }
    }
}

答案 1 :(得分:0)

正则表达式替换在这里可能真的很有帮助。我们可以尝试在单独的捕获组$1$2$3中捕获这三个术语。然后,只需使用逻辑替换这些捕获的术语,然后按需要排序即可。

String str = "Chronic Lymphocytic Leukemia :: Small Lymphocytic Lymphoma";
String[] rows = str.split("\\s+::\\s+");

for (String row : rows) {
    String output = row.replaceAll("(\\S+) (\\S+) (\\S+)", "$1 $2 $3 $1 $2 $2 $3 $1 $2 $3");
    System.out.println(output);
}

此打印:

Chronic Lymphocytic Leukemia Chronic Lymphocytic Lymphocytic Leukemia Chronic Lymphocytic Leukemia
Small Lymphocytic Lymphoma Small Lymphocytic Lymphocytic Lymphoma Small Lymphocytic Lymphoma

答案 2 :(得分:0)

几乎直接:

  • 选择第一个单词的循环;
  • 第一个循环内的第二个循环,选择最后一个词,倒退。
  • 在该循环内,您只需将单词add添加到结果中

类似:

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

如果由于某种原因stream不是一个选项,则需要第三个循环来收集单词:

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