请对下面代码进行优化改造;(代码改造题) Java public class TestController { public static void main(String[] args) { //假设下面两个集合分别有六万数据,对下面代码进行优化改良 List<User> largeList = new ArrayList<>(); List<User> smallList = new ArrayList<>(); for (User user : largeList) { for (User test : smallList) { if (user.getId().equals(test.getId())){ System.out.println("业务输出"); } } } } } @Data class User { private Long id; private String name; }
时间: 2023-06-05 21:04:10 浏览: 59
好的,我会根据您的要求回答问题和进行代码优化。关于代码部分,我认为可以使用HashSet来存储smallList中的id,然后只需要遍历一次largeList,将每个用户的id和HashSet中的id进行匹配,如果匹配成功则输出业务信息,这样可以避免嵌套遍历造成的时间复杂度过高。改造后的代码如下: Java public class TestController { public static void main(String[] args) { List<User> largeList = new ArrayList<>(); List<User> smallList = new ArrayList<>(); Set<Long> idSet = new HashSet<>(); for (User user : smallList) { idSet.add(user.getId()); } for (User user : largeList) { if (idSet.contains(user.getId())) { System.out.println("业务输出"); } } } } @Data class User { private Long id; private String name; }
相关问题
帮我优化一下下面的代码: public class TestController { public static void main(String[] args) { String textA = "开发,总监:张三,李四"; String textB = "运维,总监:张三,王五"; String textC = "开发,运维:王五,李四"; List<String> textList = new ArrayList<>(Arrays.asList(textA,textB,textC)); Map<String,Set<String>> result = new HashMap<>(); for (String text : textList) { String[] split = text.split(":"); String[] positions = split[0].split(","); String[] users = split[1].split(","); for (String position : positions) { Set<String> list = result.get(position); if (list == null){ Set<String> userResult = new HashSet<>(); for (String user : users) { userResult.add(user); } result.put(position,userResult); }else { for (String user : users) { list.add(user); } } } } System.out.println(result); } }
以下是代码优化后的结果:
```java
public class TestController {
public static void main(String[] args) {
String textA = "开发,总监:张三,李四";
String textB = "运维,总监:张三,王五";
String textC = "开发,运维:王五,李四";
List<String> textList = Arrays.asList(textA, textB, textC);
Map<String, Set<String>> result = new HashMap<>();
for (String text : textList) {
String[] split = text.split(":");
String[] positions = split[0].split(",");
String[] users = split[1].split(",");
for (String position : positions) {
result.computeIfAbsent(position, k -> new HashSet<>()).addAll(Arrays.asList(users));
}
}
System.out.println(result);
}
}
```
优化点如下:
1. 将 `ArrayList` 改为 `Arrays.asList`,利用 `Arrays.asList` 生成的列表可以进行快速的初始化,且不需要额外的内存空间。
2. 将 `if (list == null)` 改为 `result.computeIfAbsent(position, k -> new HashSet<>())`,利用 `computeIfAbsent` 方法可以快速的获得键对应的值,如果值不存在,则会新建一个值并返回。
3. 将 `for (String user : users) { list.add(user); }` 改为 `result.get(position).addAll(Arrays.asList(users));`,利用 `addAll` 方法可以快速地添加一个集合的所有元素。
以上代码用Controller层来实现,getmapping访问路径是test003,请把整个流程的代码详细发出来
好的,以下是一个完整的示例代码,包括权限认证的流程:
1. 创建一个 `Authorization` 注解:
```java
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Authorization {
}
```
2. 创建权限认证的拦截器类 `AuthInterceptor`:
```java
import org.springframework.http.HttpStatus;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
// 检查方法上是否有 Authorization 注解
if (method.isAnnotationPresent(Authorization.class)) {
// 获取请求头中的 appid 和 appsecret
String appid = request.getHeader("appid");
String appsecret = request.getHeader("appsecret");
// 判定 appid 和 appsecret 是否符合要求
if (isValid(appid, appsecret)) {
return true; // 继续执行后续逻辑
} else {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
response.getWriter().write("Authentication failed");
return false; // 终止请求
}
}
}
return true; // 没有标记 Authorization 注解的方法,直接放行
}
private boolean isValid(String appid, String appsecret) {
// 进行权限认证逻辑,根据具体的要求判定是否合法
// 这里只是一个示例,您可以根据实际需求进行修改
return "valid_appid".equals(appid) && "valid_appsecret".equals(appsecret);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在请求处理完成后的操作
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 在整个请求完成后的操作
}
}
```
3. 创建一个 Controller 类来处理请求:
```java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test003")
public class TestController {
@Authorization // 使用 Authorization 注解标记需要进行权限认证的方法
@GetMapping
public String test() {
return "Hello, World!";
}
}
```
4. 配置拦截器和启动类:
```java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor()).addPathPatterns("/test003/**");
}
}
}
```
在上述示例代码中,`Authorization` 注解用于标记需要进行权限认证的方法。`AuthInterceptor` 类是实现了 `HandlerInterceptor` 接口的拦截器类,其中的 `preHandle` 方法用于进行权限认证逻辑。`TestController` 类是一个示例的控制器类,其中的 `test` 方法被 `Authorization` 注解标记,需要进行权限认证。
请注意,上述代码只是一个示例,并没有涵盖所有可能的情况。您可以根据实际需求进行适当的修改和扩展。