Скажем так, что вам нужно дать первые неповторяющиеся строки существующей матрицы.Тогда вместо того, чтобы хранить индексы в отдельном списке, вы можете использовать Map
, для которого уникальный ключ - это набор чисел в строке, а значение - сама строка.Вот полный класс с методом main
для его проверки:
public class NonSimilar {
private final int[][] matrix;
public NonSimilar(int[][] matrix) {
this.matrix = matrix;
}
public Set<int[]> getNonSimilarRows() {
Map<Set<Integer>, int[]> map = new HashMap<>();
for (int[] row : matrix) {
map.putIfAbsent(convertRowToSet(row), row);
}
return new HashSet<>(map.values());
}
public Set<Integer> convertRowToSet(int[] row){
return Arrays.stream(row).boxed().collect(Collectors.toSet());
}
public static void main(String[] args) {
int[][] matrix = {{1, 2, 2, 4, 4}, {4, 2, 1, 4}, {3, 2, 4, 1, 5, 8}};
Set<int[]> result = new NonSimilar(matrix).getNonSimilarRows();
result.forEach(row -> System.out.println(Arrays.toString(row)));
}
}
Теперь вы можете сказать, что он печатает
3 2 4 1 5 8
1 2 2 4 4
вместо
1 2 2 4 4
3 2 4 1 5 8
Это потому, что результатом является Set
, а в наборе отсутствует концепция порядка.Если вы действительно хотите, чтобы он печатался в правильном порядке, вы можете использовать LinkedHashMap
и вернуть LinkedHashSet
.
ПРИМЕЧАНИЕ : вы можете даже сделать его корочеCollectors.toMap
:
public Set<int[]> getNonSimilarRows() {
Map<Set<Integer>, int[]> map = Arrays.stream(matrix)
.collect(Collectors.toMap(this::convertRowToSet, Function.identity(), (r1, r2) -> null));
return new HashSet<>(map.values());
}
(r1, r2) -> r1
означает, что вы принимаете дубликаты ключей и что вы должны сохранить первое найденное значение.Если вы хотите сохранить последнее найденное значение, вы можете заменить его на (r1, r2) -> r2
.