1
问题如下。有迹象表明,具有非唯一标识符多行:测试所有可能的行组合
id value
0: {1,2,3}
0: {1,2,2}
1: {1,2,3}
2: {1,2,3}
2: {1,1,3}
我具备的功能equals
,可以互相比较之间的多个行。我需要编写一个选择行的代码作为函数equals
的输入。所选的行必须具有唯一的ID,但我应该检查所有可能的唯一ID的组合。例如,如果有5行ID为0,0,1,2,3,那么我应该检查以下两种ID组合: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;
}
}
}
由于具有唯一ID的行数是先验未知的,我不知道如何解决这个问题。有什么建议么?谢谢。
编辑#1 我更新了代码。现在它更完整。但它缺少功能findUniqueRows
的实现。此函数应该从ArrayList中选择具有唯一键(ids)的行。有人可以帮助我开发这个功能吗?谢谢。
*“有什么建议吗?”*为了更快得到更好的帮助,请发布[SSCCE](http://sscce.org/)。顺便说一句 - 这是功课吗? – 2012-01-10 12:47:17
不,这不是功课。发布SSCCE的问题是我当前版本的函数'equals'与3行一起作为输入。因此,我无法在此发布。我正在等待代码片段或建议如何逐步选择行的组合。也许有人可以提供概念解决方案 – 2012-01-10 12:51:04
我会使用只生成独特组合的策略,这样您就可以避免找到并删除重复项。 – 2012-01-10 13:03:19