【发布时间】:2019-05-27 11:08:13
【问题描述】:
我需要在矩阵中找到不相似的行并返回一组这样的行。
如果这些行中出现的数字集重合,则称该行相似。
示例: 来源:
1 2 2 4 4
4 2 1 4
3 2 4 1 5 8
预期结果:
1 2 2 4 4
3 2 4 1 5 8
我的想法:
通过将二维数组转换为列表来清除每一行中的重复项>
创建新的 int[] 集并添加行,然后如果添加了行,则表示该行不相似。然后记录行数。 return 创建了一组新的原始矩阵行。 我知道我可以通过 Set 的 Add 方法的布尔返回值检查是否添加了元素。 但是 forEach 存在问题,即不提供索引。而且我不能在 forEach 中使用表达式。我该怎么办?
我的代码:
class NonSimilar {
private int[][] matrix;
private List<Set<Integer>> rows = new ArrayList<>();
public NonSimilar (int[][] matrix) {
this.matrix = matrix;
for (int i = 0; i < matrix.length; i++) {
rows.add(Arrays.stream(matrix[i]).boxed().collect(Collectors.toSet()));
}
}
public Set<int[]> getNonSimilarRows() {
Set<Set<Integer>> nonSimularRows = new HashSet<>();
rows.forEach(item -> nonSimularRows.add(item));
// Now I have to check successfully added rows numbers and construct new Set from Origin matrix
return new HashSet<int[]>();
}
}
好的。我用 for 迭代替换了 forEach,现在一切正常。
public Set<int[]> getNonSimilarRows() {
Set<Set<Integer>> nonSimularRows = new HashSet<>();
//rows.forEach(item -> nonSimularRows.add(item));
int index = -1;
ArrayList<Integer> indexes = new ArrayList<>();
for (Set<Integer> item : rows) {
index++;
if (nonSimularRows.add(item)) {
indexes.add(index);
}
}
HashSet<int[]> newSet = new HashSet<int[]>();
for (Integer item : indexes) {
newSet.add(matrix[item]);
}
return newSet;
}
无论如何,代码看起来都很丑陋,我想获得建议,我可以如何使用现代方法(如 forEach 和 Stream API)重构代码。
【问题讨论】:
-
为什么预期结果是
1 2 2 4 4和3 2 4 1 5 8而不是4 2 1 4? -
@Aomine 我相信
1 2 2 4 4与4 2 1 4在分解为一组时包含相同的元素。两者都是{1, 2, 4}。我假设 OP 想要保留第一个找到的。如果我错了,请纠正我。 -
因为第一行和第二行相似,但第一行和第三行不相似。我需要得到不相似的行。
-
请定义行的相似之处。相似度是基于 RoadRunner 所说的吗?
-
如果这些行中出现的数字集重合,则称该行相似
标签: java algorithm loops foreach set