我有一个2D int数组,我想删除重复行,例如
30,40,50
50,30,40
30,40,50
在上面的例子中,第二个&第3行是第1行的副本。
我知道ArrayList
可以动态增长和下沉,这是此概念的有用类,但我们如何将int[][]
转换为ArrayList
。
答案 0 :(得分:2)
如果您想直接使用所有唯一号码,则可以直接使用Set<Integer>
30,40,50
50,30,40
30,40,50在上面的例子中,第二个&amp;第3行是第1行的副本
如果您看到所有3行相同,那么您可以直接使用Set<Integer>
答案 1 :(得分:2)
首先,您应该创建一个Class来保存覆盖public boolean equals(Object obj)
和public int hashCode()
的数据,以指示数据的相等性。
public class Row {
private int[] ints;
public Row(int[] ints) {
this.ints = ints.clone();
Arrays.sort(this.ints);
}
@Override
public int hashCode() {
return Arrays.hashCode(ints);
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Row) {
Row another = (Row) obj;
int[] original = Arrays.copyOf(another.ints, another.ints.length);
return Arrays.equals(ints, original);
} else {
return false;
}
}
@Override
public String toString() {
return Arrays.toString(ints);
}
}
测试用例
public class Test {
public static void main(String[] args) {
int[][] arrays = new int[][]{{30,40,50}, {50,30,40}, {30,40,50}, {10, 20, 30}};
Set<Row> rows = new HashSet<Row>();
for(int[] a: arrays) {
rows.add(new Row(a));
}
for(Row row: rows) {
System.out.println(row);
}
}
}
<强>输出强>
[10, 20, 30]
[30, 40, 50]
答案 2 :(得分:0)
// lets create table
int[][] int2d = {
{ 1, 2 },
{ 2, 1 },
{ 30, 40, 50 },
{ 50, 30, 40 },
{ 30, 40, 50 }, };
// lets sort content of each row for
for (int[] row : int2d)
Arrays.sort(row);
// lets see how table looks likne now
System.out.println(Arrays.deepToString(int2d));
// this will help set do decide if element is already in
Comparator<int[]> comparator = new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
return Arrays.toString(o1).compareTo(Arrays.toString(o2));
}
};
// we create set and give him comparator (via constructor)
Set<int[]> set = new TreeSet<int[]>(comparator);
// now lets try to put every row of table in set
for (int[] row : int2d)
set.add(row);
// NOW, GREAT TEST
System.out.println("============");
for (int[] row : set)
System.out.println(Arrays.toString(row));
出:
[[1, 2], [1, 2], [30, 40, 50], [30, 40, 50], [30, 40, 50]]
============
[1, 2]
[30, 40, 50]
答案 3 :(得分:0)
这是一个最小的代码,可以消除重复项,因为你已经定义了它们:
final Integer[][] int2d = { { 30, 40, 50 }, { 50, 30, 40 }, { 30, 40, 50 }, };
final Set<Set<Integer>> r = new LinkedHashSet<Set<Integer>>();
for (Integer[] row : int2d) r.add(new LinkedHashSet<Integer>(Arrays.asList(row)));
System.out.println(r);
答案 4 :(得分:0)
如果您使用Functional Java中的持久性集合,则解决方案非常简单。
(注意: List
和Set
我在下面指的是来自Functional Java,而不是来自标准库。)
我们假设您将数据存储在xss
类型List<List<Integer>>
的变量中。
您想要做的事情可以描述如下:
重复
xss
,其标准是包含相同元素的两行应被视为相等。
List
为重复数据删除提供了方法nub
。List
是否包含相同的元素,可以通过将它们转换为Set
然后将它们进行比较来找到它们。Equal
实例传递。<强>代码:强>
xss.nub(new Equal<List<Integer>>() {
public boolean eq(List<Integer> xs1, List<Integer> xs2) {
Set<Integer> s1 = Set.iterableSet(Ord.listOrd(Ord.intOrd), xs1);
Set<Integer> s2 = Set.iterableSet(Ord.listord(Ord.intOrd), xs2);
return Equal.setEqual(Equal.intEqual).eq(s1, s2);
}
});