gpt4 book ai didi

java - 分组 Subject 和教师并提高代码性能

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:07:30 25 4
gpt4 key购买 nike

我在一次采访中被问及这个问题,我得到了一个字符串,其中包含教师和他们教授的相应科目作为输入字符串。获取科目和相应教师作为输出的任务。我已经解决了,但我有几个问题:

  • 如何对此进行改进以提高时间和空间复杂度程序。
  • 我说过时间复杂度是 n 平方,因为我使用了嵌套循环,这是正确的吗?
  • 我们可以使用 Java 8 lambda 和以更好的方式流式传输?

这是我程序的输入:

T1:S1,S3|T2:S1,S2,S4|T3:S1,S4,S5

这里T代表老师,S代表学生。在上面的例子中,T1 老师教授科目 S1 和 S3。 T2老师教授科目S1、S2、S4等

现在需求是获取Subject和对应的teacher。

["S1:T1,T2,T3", "S2:T2", "S3:T1", "S4:T2,T3", "S5:T3"]

表示科目 S1 由教师 T1、T2、T3 教授。科目S2由T1等教授。

我想出了以下可以正常工作的代码:

    /**
* input: "T1:S1,S3|T2:S1,S2,S4|T3:S1,S4,S5"
* output : ["S1:T1,T2,T3", "S2:T2", "S3:T1", "S4:T2,T3", "S5:T3"]
*/
static List<String> process(String input) {
List<String> output = null;
// Split by |
String[] arr = input.split("\\|");

Map<String, List<String>> map = new HashMap<>();

// map with key as Teacher name and value as list of students
for(int i=0; i< arr.length; i++) {
String[] data = arr[i].split(":");
map.put(data[0], Arrays.asList(data[1].split(",")));
}

Map<String, List<String>> res = new TreeMap<>();

//Build map with key as student and value as list of teachers
for(String key : map.keySet()) {
List<String> list = map.get(key);
for(String val : list) {
List<String> temp = res.get(val);
if(temp == null) {
temp = new ArrayList<>();
res.put(val, temp);
}
temp.add(key);
}

}


output = new ArrayList<>();
// Build the output as per requirement
for(String key : res.keySet()) {
StringBuilder sb = new StringBuilder();
List<String> temp = res.get(key);
for(String v : temp)
{
sb.append(v).append(",");
}
output.add(key + ":" + sb.toString().substring(0, sb.toString().length()-1) );

}

return output;
}

能否请你帮我解决这些疑惑。

最佳答案

只回答你想将其转换为 Java 8 Stream API 的部分,所以请不要接受这个答案:)

public static void main(String[] args) {
String input = "T1:S1,S3|T2:S1,S2,S4|T3:S1,S4,S5";
System.out.println(process(input));
}

private static List<String> process(String input) {
return Arrays.stream(input.split("\\|"))
.flatMap(s -> List.of(s.split(":")[1].split(","))
.stream()
.map(s1 -> s.split(":")[0] + ":" + s1))
.collect(Collectors.toMap(o -> o.split(":")[1],
o -> o.split(":")[0],
(o1, o2) -> o1 + "," + o2))
.entrySet().stream()
.map(e -> e.getKey() + ":" + e.getValue())
.collect(Collectors.toList());
}

输出

[S3:T1, S4:T2,T3, S5:T3, S1:T1,T2,T3, S2:T2]

关于java - 分组 Subject 和教师并提高代码性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54876736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com