如何从部分有序列表中查找无序元素?

时间:2017-09-06 14:40:53

标签: java sorting collections

我有一个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

未订购。

2 个答案:

答案 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);
    }
}

关于解决方案的一些注意事项:

  1. i从一开始,而不是零
  2. lastCorrect最初是第一个元素,因为它始终是正确的
  3. 仅当此元素和当前元素的顺序正确时才移动lastCorrect
  4. 缺陷包含最后的所有未排序元素

答案 1 :(得分:0)

这个定义不明确“无序”元素是什么意思。因为,例如,在这样的序列中,不清楚:“C”元素是否“无序”?

A E F A B C D

对于这个特殊问题,我可以建议你两种方式。

第一个是非常激进的:您必须创建列表的副本,对其进行排序,然后将旧列表中的每个元素与新列表中相同位置的元素进行比较。如果元素不同,则元素是无序的。

在你的特定算法中(虽然我不太明白你想用它实现什么),你可能需要更改if语句中的符号,或者使用标准String比较器:

  int compare = doc.title.compareTo(prevDoc.title);