我有一个List
,其中大部分元素都是根据字段title
排序的。有些元素没有订购。我需要确定哪些元素没有排序。
以下课程用于定义List
:
public class Doc {
String docOid;
String title;
private Doc(String docOid, String title) {
this.docOid = docOid;
this.title = title;
}
}
我写的逻辑是:
//List<Doc> docs = given partially ordered list
List<String> oids = new ArrayList<>();
for (int i = 0; i < docs.size(); i++) {
Doc doc = docs.get(i);
Doc faildDoc = null;
for (int j = 0; j < i; j++) {
Doc prevDoc = docs.get(j);
if (prevDoc.title != null && doc.title != null) {
int compare = collator.compare(prevDoc.title, doc.title); // For comparing I have used Collator
if (compare > 0) {
faildDoc = prevDoc;
break;
}
}
}
if (faildDoc != null) {
if (!oids.contains(faildDoc.docOid)) {
oids.add(faildDoc.docOid);
System.out.println(faildDoc.docOid);
}
}
}
执行后,当我在视觉上验证结果时,我可以看到逻辑没有产生正确的结果。
任何建议都会非常有用。
以下是当前结果的示例:
User Guide Metered Smart //<--Ordered
User Guide, Network Management Card //<--Ordered
User Guide. GPRS Modem //<--Ordered
Simulation sub-base //<--Un ordered
Vent Hood Installation //<--Ordered
Vented Pullbox Installation //<--Ordered
如果样品订购正确,那么将是:
Simulation sub-base
User Guide Metered Smart
User Guide, Network Management Card
User Guide. GPRS Modem
Vent Hood Installation
Vented Pullbox Installation
所以我需要找到那个
Simulation sub-base //<--Un ordered
未订购。
答案 0 :(得分:0)
您不需要两个for循环来查找列表中的缺陷。您可以从一个正确的元素移动到下一个正确的元素。这是伪代码中概述的:
lastCorrect = list.get(0);
for (int i = 1; i < list.size(); i++) {
current = list.get(i);
if (inCorrectOrder(lastCorrect, current)) {
lastCorrect = current;
} else {
defects.add(current);
}
}
关于解决方案的一些注意事项:
i
从一开始,而不是零答案 1 :(得分:0)
这个定义不明确“无序”元素是什么意思。因为,例如,在这样的序列中,不清楚:“C
”元素是否“无序”?
A E F A B C D
对于这个特殊问题,我可以建议你两种方式。
第一个是非常激进的:您必须创建列表的副本,对其进行排序,然后将旧列表中的每个元素与新列表中相同位置的元素进行比较。如果元素不同,则元素是无序的。
在你的特定算法中(虽然我不太明白你想用它实现什么),你可能需要更改if
语句中的符号,或者使用标准String
比较器:
int compare = doc.title.compareTo(prevDoc.title);