Проблема в следующем.Есть несколько строк, которые имеют неуникальные идентификаторы:
id value
0: {1,2,3}
0: {1,2,2}
1: {1,2,3}
2: {1,2,3}
2: {1,1,3}
У меня есть функция equals
, которая может сравнивать несколько строк друг с другом.Мне нужно написать код, который выбирает строки в качестве ввода функции equals
.Выбранные строки должны иметь уникальные идентификаторы, НО я должен проверить все возможные комбинации уникальных идентификаторов.Например, если есть 5 строк с идентификаторами: 0,0,1,2,3, то я должен проверить следующие две комбинации идентификаторов: 0,1,2,3 и 0,1,2,3, потому что 0появляется дважды.Разумеется, каждая из этих двух комбинаций будет состоять из уникальных строк с id = 0.
Мой фрагмент кода следующий:
public class Test {
public static void main(String[] args) {
ArrayList<Row> allRows = new ArrayList<Row>();
allRows.add(new Row(0,new int[]{1,2,3}));
allRows.add(new Row(0,new int[]{1,2,2}));
allRows.add(new Row(1,new int[]{1,2,3}));
allRows.add(new Row(2,new int[]{1,2,3}));
allRows.add(new Row(2,new int[]{1,1,3}));
boolean answer = hasEqualUniqueRows(allRows);
}
private boolean hasEqualUniqueRows(ArrayList<Row> allTokens) {
for (int i=0; i<allTokens.size(); i++) {
ArrayList<Integer[]> rows = new ArrayList<Integer[]>();
rows = findUniqueRows(i,allTokens);
boolean answer = equalsExceptForNulls(rows);
if (answer) return true;
}
return false;
}
// Compare rows for similarities
public static <T> boolean equalsExceptForNulls(ArrayList<T[]> ts) {
for (int i=0; i<ts.size(); i++) {
for (int j=0; j<ts.size(); j++) {
if (i != j) {
boolean answer = equals(ts.get(i),ts.get(j));
if (!answer) return false;
}
}
}
return true;
}
public static <T> boolean equals(T[] ts1, T[] ts2) {
if (ts1.length != ts2.length) return false;
for(int i = 0; i < ts1.length; i++) {
T t1 = ts1[i], t2 = ts2[i];
if (t1 != null && t2 != null && !t1.equals(t2))
return false;
}
return true;
}
class Row {
private String key;
private Integer[] values;
public Row(String k,Integer[] v) {
this.key = k;
this.values = v;
}
public String getKey() {
return this.key;
}
public Integer[] getValues() {
return this.values;
}
}
}
Поскольку число строк с уникальными идентификаторами априори неизвестно, я не знаю, как решить эту проблемупроблема.Какие-либо предложения?Спасибо.
Редактировать # 1 Я обновил код.Теперь это более полно.Но в ней отсутствует реализация функции findUniqueRows
.Эта функция должна выбирать строки из ArrayList, которые имеют уникальные ключи (идентификаторы).Может ли кто-нибудь помочь мне развить эту функцию?Спасибо.