Java将多个一维数组数据正交获得多种结果的新数组数据
现有一个功能,根据中文获取拼音功能,而获取到的拼音有多音字,所以有可能一个字对应多个音标,所以,有可能出现多种名称组合情况。现在写一个方法,可以将多个一维数组结构的组合一个正交结果。
public static void main(String[] args) {
//造数据
List<String> array1 = Arrays.asList("高","刘");
List<String> array2 = Arrays.asList("一","二","三");
List<String> array3 = Arrays.asList("美","帅","靓");
List<List<String>> list = new ArrayList<>();
list.add(array1);
list.add(array2);
list.add(array3);
//将多个数组正交获得拼接字符串后的结果数组
List<String> result = orthogonalArray(list);
//输出结果为 [高一美, 高一帅, 高一靓, 高二美, 高二帅, 高二靓, 高三美, 高三帅, 高三靓, 刘一美, 刘一帅, 刘一靓, 刘二美, 刘二帅, 刘二靓, 刘三美, 刘三帅, 刘三靓]
System.out.println(result);
}
public static List<String> orthogonalArray(List<List<String>> arrays) {
int rowCount = 1;
for (List<String> array : arrays) {
rowCount *= array.size();
}
String[][] result = new String[rowCount][arrays.size()];
int cycle = rowCount;
int arrayIndex = 0;
int repeatCount = 1;
for (List<String> array : arrays) {
cycle /= array.size();
int elementIndex = 0;
for (int i = 0; i < repeatCount; i++) {
for (int j = 0; j < array.size(); j++) {
for (int k = 0; k < cycle; k++) {
result[elementIndex][arrayIndex] = array.get(j);
elementIndex++;
}
}
}
repeatCount *= array.size();
arrayIndex++;
}
List<String> listRes = new ArrayList<>();
for (String[] row : result) {
StringBuffer nameStr = new StringBuffer();
for (String item : row) {
nameStr.append(item);
}
listRes.add(nameStr.toString());
}
return listRes;
}