ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • List<VO> 정렬 DESC , ASC(2차 보완 완료)
    Java & 배경지식/Java 개발에 도움되는 코드들.. 2020. 7. 5. 22:40
    반응형

    사용법

    CommonListSort.sortListVO(list, "getName", "DESC");
    CommonListSort.sortListVO(list, "getName", "ASC");

     

     

    public class RunMain {
    
    	public static void main(String[] args) {
    		TestVO vo;
    		List<TestVO> list = new ArrayList<TestVO>();
    
    		for (int i = 1; i <= 9; i++) {
    			vo = new TestVO();
    			vo.setName("김진석" + i);
    			vo.setHeight(i + 170);
    			vo.setAge(i);
    			list.add(vo);
    		}
    
    		for (TestVO testVO : list) {
    			System.out.println(testVO);
    		}
    		System.out.println("===========================");
    		CommonListSort.sortListVO(list, "getName", "DESC");
    		for (TestVO testVO : list) {
    			System.out.println(testVO);
    		}
    	}
    }

     

    public class TestVO {
    	private String name;
    	private int age;
    	private double height;
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getAge() {
    		return age;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    
    	public double getHeight() {
    		return height;
    	}
    
    	public void setHeight(double height) {
    		this.height = height;
    	}
    
    	@Override
    	public String toString() {
    		return "TestVO [name=" + name + ", age=" + age + ", height=" + height + "]";
    	}
    }

     

    내가 생각하는 문제점

    1 . if문대신에 메소드를 하나 만들어서 깊이 줄이기

    2. 예외처리가 너무 많음

    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    
    /**
     * List<VO> 정렬
     *
     * @param list             비교할 리스트(List<VO> 만 가능)
     * @param methodName       비교할 getter 함수
     * @param sortKinds        정렬 문자열 (ASC, DESC)
     */
    public class CommonListSort {
    
    	public static void sortListVO(List<?> list, String methodName, String sortKinds) {
    		Collections.sort(list, new Comparator<Object>() {
    
    			@Override
    			public int compare(Object firstObject, Object secondObject) {
    				String firstData = "";
    				String secondData = "";
    				int firstValue = 0;
    				int secondValue = 0;
    				int compareIndex = 0; // 비교 인덱스(작은 문자열)
    
    			    // ASC 조건이 되기위한 return 값 조건은 아래와 같다.(DESC는 반대)
    				// 첫 번째 파라미터 < 두 번째 파라미터 : 음수 리턴
    				// 첫 번째 파라미터 == 두 번째 파라미터 : 0 리턴
    				// 첫 번째 파라미터 > 두 번째 파라미터 : 양수 리턴
    				int status = 0;
    
    				try {
    					Method firstMethod = firstObject.getClass().getDeclaredMethod(methodName);
    					firstData = (String) firstMethod.invoke(firstObject, new Object[] {});
    					Method secondMethod = secondObject.getClass().getDeclaredMethod(methodName);
    					secondData = (String) secondMethod.invoke(secondObject, new Object[] {});
    
    					if ("DESC".equals(sortKinds)) {
    						if (firstData.compareTo(secondData) == 0) {
    							compareIndex = firstData.length();
    						} else if (firstData.compareTo(secondData) > 0) {
    							status = -1;
    							compareIndex = secondData.length();
    						} else if (firstData.compareTo(secondData) < 0) {
    							status = 1;
    							compareIndex = firstData.length();
    						}
    					} else if ("ASC".equals(sortKinds)) {
    						if (firstData.compareTo(secondData) == 0) {
    							compareIndex = firstData.length();
    						} else if (firstData.compareTo(secondData) > 0) {
    							status = 1;
    							compareIndex = secondData.length();
    						} else if (firstData.compareTo(secondData) < 0) {
    							status = -1;
    							compareIndex = firstData.length();
    						}
    					}
    
    					for (int i = 0; i < compareIndex; i++) {
    						firstValue = Integer.valueOf(firstData.charAt(i));
    						secondValue = Integer.valueOf(secondData.charAt(i));
    
    						if ("DESC".equals(sortKinds)) {
    							if (firstValue > secondValue) {
    								status = -1;
    								break;
    							} else if (firstValue < secondValue) {
    								status = 1;
    								break;
    							}
    						} else {
    							if (firstValue < secondValue) {
    								status = -1;
    								break;
    							} else if (firstValue > secondValue) {
    								status = 1;
    								break;
    							}
    						}
    					}
    
    				} catch (NoSuchMethodException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (SecurityException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (IllegalAccessException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (InvocationTargetException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (NullPointerException e) {
    					e.printStackTrace();
    				}
    
    				return status;
    			}
    
    		});
    	}
    }
    

     

     

     

    2020년 07월 05일 19시

    위의 코드를 줄이기위해서 생각을 많이 하였다...

     

    1차적으로 steam을 이용하여 sorting하는 것이다.

     

    sorted()함수는 인자로 comparator를 갖는다.

     

    그러면 아래와같이 줄일 수가 있다. 

     

    만약에 역순으로 한다면 아래와같이 reversed() method를 사용하면 된다.

     

     

    java.util.Comparator.comparing;

     

     

    import static java.util.Comparator.comparing;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.stream.Collectors;
    import static java.util.Comparator.comparing;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.stream.Collectors;
    public class RunMain {
    
    	public static void main(String[] args) {
    		TestVO vo;
    		List<TestVO> list = new ArrayList<TestVO>();
    
    		for (int i = 1; i <= 9; i++) {
    			vo = new TestVO();
    			vo.setName("김진석" + i);
    			vo.setHeight(i + 170);
    			vo.setAge(i);
    			list.add(vo);
    		}
    
    		for (TestVO testVO : list) {
    			System.out.println(testVO);
    		}
    		System.out.println("=====================");
    		list = list.stream()
    	            .sorted(comparing(TestVO::getName).reversed())
    	            .collect(Collectors.toList());
    		for (TestVO testVO : list) {
    			System.out.println(testVO);
    		}
    	}
    }

     

     

     

     

    2차적으로는 아래와 같이 람다를 사용하는 것이다.

    public class RunMain {
    
    	public static void main(String[] args) {
    		TestVO vo;
    		List<TestVO> list = new ArrayList<TestVO>();
    
    		for (int i = 1; i <= 9; i++) {
    			vo = new TestVO();
    			vo.setName("김진석" + i);
    			vo.setHeight(i + 170);
    			vo.setAge(i);
    			list.add(vo);
    		}
    
    		for (TestVO testVO : list) {
    			System.out.println(testVO);
    		}
    		System.out.println("=====================");
    
    		list = list.stream().sorted( (age, age2) -> age.getAge() <= age2.getAge()  ? 1 : -1)
    				.collect(Collectors.toList());
    
    		for (TestVO testVO : list) {
    			System.out.println(testVO);
    		}
    	}
    }

     

     

    이번에 혼자 코드를 줄이면서 가독성이 좋게 어떻게 개발을 할까 생각을 하다가(지인에게 도움도 받긴했지만..)

     

    깊게 생각하여 코드를 줄인다는 재미가 있어 매우 좋았다..

    반응형

    'Java & 배경지식 > Java 개발에 도움되는 코드들..' 카테고리의 다른 글

    Server에서 다른 api 호출  (0) 2020.07.27
    Java Server에서 페이징 Html 태그 그리기  (0) 2020.07.24
    poi  (0) 2020.04.26
    sftp 연결  (0) 2020.03.23
    IP 가져오기  (0) 2020.03.18
Designed by Tistory.