java顺序表的无序表,Java – 匹配两个无序列表

我有以下问题:我需要在两个列表中找到相同元素的对,这些列表是无序的.关于这两个列表的事情是它们“大致相等” – 只有某些元素被一些索引移动,例如(注意,这些对象不是整数,我只是在这个例子中使用整数):

[1,2,3,5,4,8,6,7,10,9]

[1,2,3,4,5,6,7,8,9,10]

我的第一次尝试是迭代两个列表,并根据每个对象的一些唯一键生成两个HashMaps.然后,在第二遍时,我只需从两个地图中拉出元素.这在空间和时间上产生O(2N).

我正在考虑一种不同的方法:我们将保留指向两个列表中当前元素的指针,以及每个列表的当前未匹配集.伪代码将是以下类型:

while(elements to process)

elem1 = list1.get(index1)

elem2 = list2.get(index2)

if(elem1 == elem2){ //do work

... index1++;

index2++;

}

else{

//Move index of the list that has no unamtched elems

if(firstListUnmatched.size() ==0){

//Didn't find it also in the other list so we save for later

if(secondListUnamtched.remove(elem1) != true)

firstListUnmatched.insert(elem1)

index1++

}

else { // same but with other index}

}

以上可能不起作用……我只是想大致了解你对这种方法的看法.基本上,这在每个列表的一侧维护一个散列集,其大小<

最佳答案

I cannot simply return a set intersection of two object lists, as I need to perform operations (multiple operations even) on the objects I find as matching/non-matching

您可以维护一组不匹配的对象.这将是空间中的O(M),其中M是任何点处交换元素的最大数量.对于N是元素数的时间,它将是O(N).

interface Listener {

void matched(T t1);

void onlyIn1(T t1);

void onlyIn2(T t2);

}

public static void compare(List list1, List list2, Listener tListener) {

Set onlyIn1 = new HashSet();

Set onlyIn2 = new HashSet();

for (int i = 0; i < list1.size(); i++) {

T t1 = list1.get(i);

T t2 = list2.get(i);

if (t1.equals(t2)) {

tListener.matched(t1);

continue;

}

if (onlyIn2.remove(t1))

tListener.matched(t1);

else

onlyIn1.add(t1);

if (!onlyIn1.remove(t2))

onlyIn2.add(t2);

}

for (T t1 : onlyIn1)

tListener.onlyIn1(t1);

for (T t2 : onlyIn2)

tListener.onlyIn2(t2);

}

/* * 基于列实现(无序)词典结构 */ package dsa; public class Dictionary_DLNode implements Dictionary { private List L;//存放条目的列 private EqualityTester T;//判等器 //构造方法 public Dictionary_DLNode() { this(new EqualityTesterDefault()); } //默认构造方法 public Dictionary_DLNode(EqualityTester t) { L = new List_DLNode(); T = t; } /***************************** ADT方法 *****************************/ //查询词典结构当前的规模 public int getSize() { return L.getSize(); } //判断词典结构是否为空 public boolean isEmpty() { return L.isEmpty(); } //若词典中存在以key为关键码的条目,则返回其中的一个条目;否则,返回null public Entry find(Object key) { Iterator P = L.positions(); while (P.hasNext()) { Position pos = (Position)P.getNext(); Entry entry = (EntryDefault) pos.getElem(); if (T.isEqualTo(entry.getKey(), key)) return entry; } return null; } //返回由关键码为key的条目组成的迭代器 public Iterator findAll(Object key) { List list = new List_DLNode(); Iterator P = L.positions(); while (P.hasNext()) { Position pos = (Position)P.getNext(); Entry entry = (EntryDefault) pos.getElem(); if (T.isEqualTo(entry.getKey(), key)) list.insertLast(entry); } return new IteratorElement(list); } //插入条目(key, value),并返回该条目 public Entry insert(Object key, Object value) { Entry entry = new EntryDefault(key, value);//创建新条目 L.insertFirst(entry);//将新条目插至首,并 return entry;//返回null标志 } //若词典中存在以key为关键码的条目,则将摘除其中的一个并返回;否则,返回null public Entry remove(Object key) { Iterator P = L.positions(); while (P.hasNext()) {//逐一对比 Position pos = (Position)P.getNext();//各个位置 Entry entry = (EntryDefault) pos.getElem();//处的条目 if (T.isEqualTo(entry.getKey(), key)) {//若发现key已出现在某个条目中,则 Entry oldEntry = entry;//先保留该条目 L.remove(pos);//删除该条目 return oldEntry;//最后返回原先的条目 } }//若此循环结束,说明key尚未在词典中出现,因此 return null;//返回null标志 } //返回词典中所有条目的一个迭代器 public Iterator entries() { return new IteratorElement(L); }//直接利用List接口的方法生成元素迭代器 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值