家庭作业的想法

时间:2017-03-28 03:52:08

标签: java

我不是在为我的作业寻找代码解决方案,而只是关于如何做的一些想法。

输入是两个字符串参数,其中第一个大于第二个。 例如:“一个”,“两个”;将被读作一个大于两个。

到目前为止,我使用LinkedList相应地添加值,但这并不能完全完成这项工作(如下所述)。你对这项任务的建议是什么?

(输入:)一两,二,三,六,六一将导致: 六 - >一个 - >二 - >三 - > 5个
而不是:五 - >六 - >一个 - >二 - > 3

TLDR:LinkedList不能用于完成此分配。我正在考虑使用双向链表来存储两个输入之间的连接,因此在上面的示例中,它将是五个< - >。六,产生如下的dLL:五 - < - >六 - < - >一个< - >两个< - > 3

您将使用什么数据结构?

1 个答案:

答案 0 :(得分:0)

您需要做的第一件事是如何存储您知道的所有数据,即什么比“更大”?为此,我将使用Map<String, Set<String>>。将一个字符串映射到比它小的所有字符串。

Map<String, Set<String>> greaterThan = new HashMap<>();

接下来,您将需要使用一些数据填充此数据映射,我将通过简单的迭代来完成此操作。

// Example Input
String[][] inputs = new String[][]{
        {"one", "two"},
        {"two", "three"},
        {"five", "six"},
        {"six", "one"}
};

// Populate
for (String[] pair : inputs) {
    String bigger = pair[0];
    String smaller = pair[1];

    if (!greaterThan.containsKey(bigger))
        greaterThan.put(bigger, new HashSet<>());
    greaterThan.get(bigger).add(smaller);

}

接下来,在这种情况下,我们需要获取我们需要排序的所有数据。我将使用Set<String>删除重复项,然后将其转换为列表。

Set<String> dataSet = new HashSet<>();
for (String[] pair : inputs) {
    dataSet.addAll(Arrays.asList(pair));
}
List<String> data = new ArrayList<>(dataSet);

最后,我们需要使用之前创建的地图对该列表进行排序。

data.sort((o1, o2) -> {
    if (greaterThan.getOrDefault(o1, Collections.emptySet()).contains(o2))
        return 1;
    else if (greaterThan.getOrDefault(o2, Collections.emptySet()).contains(o1))
        return -1;
    return 0;
});

就是这样!现在打印结果!

System.out.println(data); //Output: [three, two, one, six, five]

应该注意的是,通过同时执行多个步骤(比如收集数据并将数据添加到映射中)可以更有效地编写这一点,但是这里有一个开始的地方!