本人碰到一个比较棘手的算法问题,问题描述如下:一个arrayList中含有若干个对象,每个对象有两个属性和content,要求如下:只要title或者content其中一个相同,则认为是相同对象,输出排重后的对象(相同对象输出其中一个即可)和重复和个数
Class A {
String title,
String content
};
ArrayList arrayList = new ArrayList();
A a1 = New A();
a1.title = T1;
a1.content = C1;
arrayList.add(a1);
A a2 = New A();
a2.title = T1;
a2.content = C2;
arrayList.add(a2);
A a3 = New A();
a3.title = T2;
a3.content = C2;
arrayList.add(a3);
A a4 = New A();
a4.title = T2;
a4.content = C1;
arrayList.add(a4);
A a5 = New A();
a5.title = T5;
a5.content = C5;
arrayList.add(a5);
最后程序运行完成后,输出 a1(4),a5(1)
程序解释:a1、a2、a3、a4是相同对象,原因:a1.title = a2.title,a2.content = a3.content,a4.title = a3.title,
哪位帮忙写一下代码或者思路
package com.auto.main;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String... strings){
ArrayList<A> arrayList = new ArrayList<A>();
A a1 = new A();
a1.title = "T1";
a1.content = "C1";
arrayList.add(a1);
A a2 = new A();
a2.title = "T1";
a2.content = "C2";
arrayList.add(a2);
A a3 = new A();
a3.title = "T2";
a3.content = "C2";
arrayList.add(a3);
A a4 = new A();
a4.title = "T2";
a4.content = "C1";
arrayList.add(a4);
A a5 = new A();
a5.title = "T5";
a5.content = "C5";
arrayList.add(a5);
Test t = new Test();
//System.out.println(t.get(arrayList));
List<List<A>> llist = t.get(arrayList);
for(List<A> l:llist){
System.out.println("========start===========");
for(A a : l){
System.out.println(" a.content=" + a.content + ";a.title=" + a.title);
}
System.out.println("========end===========");
}
}
/**
*
* @param aList
* @return
*/
public List<List<A>> get(List<A> aList){
List<List<A>> result = new ArrayList<List<A>>();
List<A> key = new ArrayList<A>();
result.add(key);
key.add(aList.get(0));
aList.remove(0);
aList= process(aList,result);
while(!aList.isEmpty()){
aList= process(aList,result);
}
return result;
}
List<A> process(List<A> aList,List<List<A>> result){
List<A> key = result.get(result.size()-1);//最后一个
for(int i=0;i<aList.size();i++ ){
A m = aList.get(i);
for(A k : key){
if(m.content.equals(k.content)||m.title.equals(k.title)){
key.add(m);
aList.remove(i);
return aList;
}
}
}
List<A> ss = new ArrayList<A>();
ss.add(aList.get(0));
aList.remove(0);
result.add(ss);
return aList;
}
}
/**
无聊啊,把代码写了下
*/
重写hashcode 和equals 。
只要title或者content其中一个相同,则认为是相同对象,
这个业务规则貌似有二义性的.请看分析.
{"a","m"}={"a","n"}={"b","n"}
{"a","m"}={"b","n"},按照这个意思就是所有的Class A 的对象是一样的.
不知道我理解的对不对,改业务规则吧~
哦 我弄错了,这个问题有解!是这样处理的.
List result =new ArrayList();//这个列表存的对象是列表
for(arrayList){
A a ;
for(result ){
//1个个判断,在的话就加进去,不再的话就新建一个List加到result
}
}
汗,当arrayList(下面称集合)的值不同会导致不同的结果(就是说判断对象是否相等依赖集合)。
1建一个结果列表result,然后丢进去第一个,将第一个从集合删除。
2设置标志是否有放入,然后遍历集合,如果相等则放入,并从集合删除。
3如果标志为有放入,则需要转2继续处理,否则4。
4集合不为空,取第一个放入result,然后类似转1.直到集合为空结束。
关键业务是否是这样,很奇怪,如果arrayList引入一个新元素,那么结果就会大变样这样是不是现实?(比如在你的例子中引入)
A a6 = New A();
a5.title = T5;
a5.content = C2;
那么结果就是所有对象都是一样的了。