我正在尝试在多个定界符上创建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]);
}
}
关于如何实现这一目标的任何想法
答案 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)
几乎直接:
类似:
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;
}