Java_비교 및 정렬

객체 정렬


정렬이 필요한 집합이나 그룹이 단순한 숫자 형식이 아닐 때, 보통 Comparator나 Comparable를 사용하여 간단한 방식으로 대상의 정렬이나 사용자 정의 정렬을 실현할 수 있다.
Comparator와 Comparable의 차이점은 다음과 같습니다.
  • Comparable는 대상 자체에 사용되는데 이 대상은 비교될 수 있다는 것을 의미한다. 즉, 정렬될 수 있다는 것이다.(String과 Integer가 크기를 비교할 수 있는 이유는 모두 Comparable 인터페이스를 실현하고compareTo() 방법을 실현했기 때문이다.
  • Comparator는 객체 외부에 사용되며 정렬 알고리즘을 정의하여 정렬하는 것과 같습니다.

  • 다음은 구체적인 예를 통해 Comparator와 Comparable의 차이점을 이해한다.

    Comparable

    package com.tianjf;
    
    import java.util.Arrays;
    
    public class User implements Comparable<Object> {
    
    	private String id;
    	private int age;
    
    	public User(String id, int age) {
    		this.id = id;
    		this.age = age;
    	}
    
    	public int getAge() {
    		return age;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    
    	public String getId() {
    		return id;
    	}
    
    	public void setId(String id) {
    		this.id = id;
    	}
    
    	@Override
    	public int compareTo(Object o) {
    		return this.age - ((User) o).getAge();
    	}
    
    	/**
    	 *  
    	 */
    	public static void main(String[] args) {
    		User[] users = new User[] { new User("a", 30), new User("b", 20) };
    		Arrays.sort(users);
    		for (int i = 0; i < users.length; i++) {
    			User user = users[i];
    			System.out.println(user.getId() + " " + user.getAge());
    		}
    	}
    }

    Comparator

    package com.tianjf;
    
    import java.util.Arrays;
    import java.util.Comparator;
    
    public class MyComparator implements Comparator<Object> {
    
    	@Override
    	public int compare(Object o1, Object o2) {
    		return toInt(o1) - toInt(o2);
    	}
    
    	private int toInt(Object o) {
    		String str = (String) o;
    		str = str.replaceAll(" ", "1");
    		str = str.replaceAll(" ", "2");
    		str = str.replaceAll(" ", "3");
    		return Integer.parseInt(str);
    	}
    
    	/**
    	 *  
    	 */
    	public static void main(String[] args) {
    		String[] array = new String[] { " ", " ", " " };
    		Arrays.sort(array, new MyComparator());
    		for (int i = 0; i < array.length; i++) {
    			System.out.println(array[i]);
    		}
    	}
    }

    equals () 를 복사할 때hashcode () 를 꼭 복사해야 합니까?


    답은: 꼭 그렇지는 않다.
    일반적인 상황에서hashcode() 방법을 복사할 필요가 없다. 어떤 집합(HashSet,LinkedHashSet,HashMap,LinkedHashMap)을 사용할 때 반드시hashcode() 방법을 복사해야 한다. 이런 집합은 해시 알고리즘을 사용했기 때문에 해시 알고리즘은hashcode()를 사용해야 한다.해시 알고리즘에 관해서는 참고할 수 있다http://blog.csdn.net/tianjf0514/article/details/7709588.
    이참에 equals 방법을 복사할 때 주의해야 할 점을 말씀드리겠습니다.
  • 자반성: 비공식 인용 x에 대해 x.equals(x)는true
  • 로 되돌아와야 한다
  • 대칭성: 인용 x와 y에 대해 x.equals(y)가true로 되돌아오면 y.equals(x)도true
  • 로 되돌아와야 한다.
  • 전달성: 인용 x, y와z에 대해 x.equals(y)가true로 되돌아오고 y.equals(z)가true로 되돌아오면 x.equals(z)도true
  • 로 되돌아와야 한다.
  • 일치성: x와 y가 인용한 대상에 변화가 없으면 x.equals(y)를 반복적으로 호출하면 같은 결과를 되돌려야 한다
  • 비공식성: 비공식 인용 x에 대해 x.equals(null)는false
  • 로 되돌아와야 합니다
    이런 규정들을 소홀히 하지 마라. 만약 그것을 위반한다면, 너의 프로그램은 정상적이지 않고, 심지어는 붕괴될 뿐만 아니라, 실패의 근원을 찾기 어려울 것이다.어떤 종류도 고립되지 않는다. 한 종류의 실례는 보통 다른 종류에 빈번하게 전달된다. 많은 종류가 있는데 모든 집합 종류를 포함하여 그들에게 전달된 대상이 equals 약속을 준수했는지 여부에 의존한다.다음은 equals () 를 복사하는 방법의 예를 들겠습니다.
    public boolean equals(Object obj) {
    	boolean result = false;
    
    	if (obj == null) {
    		result = false;
    	}
    
    	if (this == obj) {
    		result = true;
    	}
    
    	if (obj instanceof Student) {
    		Student stu = (Student) obj;
    		if (stu.getName().equals(this.name) && stu.getAge() == (this.age)) {
    			result = true;
    		}
    	} else {
    		result = false;
    	}
    	return result;
    }

    좋은 웹페이지 즐겨찾기