【问题标题】:How to find Unordered elements from a partially ordered list?如何从部分有序列表中找到无序元素?
【发布时间】:2017-09-06 14:40:53
【问题描述】:

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

未排序。

【问题讨论】:

  • 您必须首先精确定义什么是“未排序元素”。
  • @Andremoniy,更新了一个示例。
  • 这是您当前或预期结果的样本吗?
  • @alayor,请检查更新
  • 那么对于Simulation sub-base,您当前和预期的结果是否相同?抱歉,我认为该示例有点令人困惑。

标签: java sorting collections


【解决方案1】:

您不需要两个 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. defects 末尾包含所有未排序的元素

【讨论】:

    【解决方案2】:

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

    A E F A B C D
    

    对于这个特定的问题,我可以建议你两种方法。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-26
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 2020-12-30
      • 1970-01-01
      相关资源
      最近更新 更多