在一次采访中,我被问及这个问题,在采访中,我得到了一个字符串,上面有老师和他们作为输入字符串教的相应科目任务是把被试和相应的教师作为输出我已经解决了,但我有几个问题:
如何改进这一点,以提高时间和空间的复杂性
程序。
我说,时间复杂度是n平方,因为我已经使用嵌套。
回路,对吗?
我们能用Java 8 lambdas和
以更好的方式流动?
以下是我的程序的输入:

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

这里T代表老师,S代表学生在上面的例子中,T1老师教科目S1和S3T2老师讲授科目S1、S2、S4等
现在的要求是得到科目和相应的老师。
["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流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]

10-07 21:55