我不是在为我的作业寻找代码解决方案,而只是关于如何做的一些想法。
输入是两个字符串参数,其中第一个大于第二个。 例如:“一个”,“两个”;将被读作一个大于两个。
到目前为止,我使用LinkedList相应地添加值,但这并不能完全完成这项工作(如下所述)。你对这项任务的建议是什么?
(输入:)一两,二,三,六,六一将导致:
六 - >一个 - >二 - >三 - > 5个
而不是:五 - >六 - >一个 - >二 - > 3
TLDR:LinkedList不能用于完成此分配。我正在考虑使用双向链表来存储两个输入之间的连接,因此在上面的示例中,它将是五个< - >。六,产生如下的dLL:五 - < - >六 - < - >一个< - >两个< - > 3
您将使用什么数据结构?
答案 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]
应该注意的是,通过同时执行多个步骤(比如收集数据并将数据添加到映射中)可以更有效地编写这一点,但是这里有一个开始的地方!