【发布时间】:2012-01-10 12:22:35
【问题描述】:
问题如下。有多个行具有非唯一标识符:
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 的唯一行。
我的代码 sn-p 如下:
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 中选择具有唯一键 (id) 的行。有人可以帮我开发这个功能吗?谢谢。
【问题讨论】:
-
“有什么建议吗?” 如需尽快获得更好的帮助,请发帖SSCCE。顺便说一句 - 这是作业吗?
-
不,这不是家庭作业。发布 SSCCE 的问题是我当前版本的函数“equals”使用 3 行作为输入。因此,我不能在这里发布。我正在等待代码 sn-ps 或建议如何逐步选择行组合。也许有人可以提供概念解决方案?
-
我会使用只生成唯一组合的策略,这样您就可以避免查找和删除重复项。
-
@Peter Lawrey:问题是我无法避免行的非唯一标识符。这就是我的问题的重点。
-
我不确定你想做什么。您需要唯一的 ID 和行吗?您的示例的预期输出是什么?我将从为 Row 类实现 hashCode 开始,并尝试使用 HashMap 或 HashSet。首先删除重复项(相同的 id 和内容),然后在剩下的集合中找到具有相同内容的行。
标签: java arrays search comparison