English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 컬렉션 프레임워크 문제에 대한 여러 해결책

문제:특정 반30개의 학생의 학번은20070301-20070330, 모든 학생이 Java 프로그래밍 설계 과정을 선택하였습니다. 모든 학생의 성적을 출력합니다(임의의 수를 생성할 수 있으며, 범위60-100),본반의 모든 학생의 성적을 낮은 순으로 정렬하여 출력하는 프로그램을 작성하십시오.

요구사항:List, Map, Set을 사용하여 구현하고, 출력되는 정보는 학번, 이름, 성적입니다.

1List集合을 사용하여

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.Iterator; 
import java.util.LinkedList; 
import java.util.TreeMap; 
public class Test2{ 
  public static void main(String[] args){ 
    /* 이곳에서는 ArrayList을 사용합니다 
     * 
     * ArrayList<Student> al = new ArrayList<Student>(); 
    for(int i=20070301,j=10;i<=20070330;i++,j++) 
    { 
      al.add(new Student(i, (int) (40*Math.random()+60), "동료"+j)); 
    } 
    //ArrayList 정렬은 Collections의 sort() 메서드를 통해 구현됩니다. 
    Collections.sort(al, new Sortbygrade()); 
    for(Student sd:al) 
    System.out.println(sd); 
    */ 
    LinkedList<Student> lt = new LinkedList<Student>(); 
    for(int i=20070301,j=10;i<=20070330;i++,j++) 
    { 
      lt.add(new Student(i, (int) (40*Math.random()+60), "동료"+j)); 
    } 
    //링크드 리스트 정렬 
    Collections.sort(lt, new Sortbygrade()); 
    //링크드 리스트 출력 
    for(Student sd:lt) 
      System.out.println(sd); 
  } 
} 
//학생 클래스 
class Student{ 
  int num, grade; 
  String name; 
  //생성자 
  public Student(int num, int grade, String name){ 
    this.num=num; 
    this.name=name; 
    this.grade=grade; 
  } 
  //이곳에서는 필수로 재정의해야 합니다 
  public String toString(){ 
//   System.out.println("hi"); 
    return "학번:"+this.num+"\t"+"이름:"+this.name+"  "+"성적:"+this.grade; 
  } 
} 
//비교기 클래스를 생성합니다 
class Sortbygrade implements Comparator<Student>{ 
  @Override 
  public int compare(Student s1, Student s2) { 
    if(s1.grade>s2.grade) 
      return 1; 
    if(s1.grade<s2.grade) 
      return -1; 
    if(s1.grade==s2.grade) 
      return s1.name.compareTo(s2.name); 
    return 0;     
  } 
} 

 출력 결과는 다음과 같습니다:

List集合 프레임워크에 대한요약:

1List集合은 실제로는 동적 배열이며, 요소는 for문을 통해 직접 꺼내지 않아도 됩니다.
2List 집합을 출력할 때는 기본적으로 집합에 저장된 객체의 toString() 메서드를 호출합니다. 따라서 클래스에서 toString() 메서드를 오버라이드해야 합니다.
toString() 메서드를 오버라이드하지 않으면, 반드시 사용해야 합니다

for(int i=0;i<lt.size();i++) 
{ 
  Student s=lt.get(i); 
  System.out.println("학생编号:"+s.num+"  이름:"+s.name+"  점수:"+s.grade); 
} 

3List 집합의 정렬은 Collections 도구 클래스를 사용해야 합니다. 즉 Collections.Sort(list, new 비교기 클래스()) 메서드입니다. 따라서 비교기를 정의한自定义 클래스를 정의해야 합니다.

2Set 집합을 사용하여
(1를 통해 TreeSet을 사용하여

package com.package1; 
import java.util.*; 
public class StuScore { 
public static void main(String[] args) { 
   
  //요소를 추가합니다 
  for(int i=20070301,j=1;i<=20070330;i++,j++) 
  { 
    ts.add(new Student(i,"학생"+j,(int) (40*Math.random()+60))); 
  } 
  //반복적으로 추출합니다 
  Iterator<Student> it=ts.iterator(); 
  while(it.hasNext()) 
  { 
    Student o1=it.next(); 
    System.out.println("학생编号:"+o1.num+" "+"이름:"+o1.name+" "+" "+"점수:"+o1.grade); 
  } 
} 
} 
//학생 클래스 
class Student  
{ 
int num; 
int grade; 
String name; 
public Student(int num, String name, int grade) 
{ 
  this.num=num; 
  this.name=name; 
  this.grade=grade; 
} 
} 
class Com implements Comparator 
{ 
@Override 
public int compare(Object o1, Object o2) { 
  Student s1=(Student) o1; 
  Student s2=(Student) o2; 
  if(s1.grade>s2.grade) 
    return 1; 
  if(s1.grade<s2.grade) 
    return -1; 
  if(s1.grade==s2.grade) 
  { 
    return new Integer(s1.num).compareTo(new Integer(s2.num)); 
  } 
  return 0; 
} 
} 

출력 결과는 다음과 같습니다:

학번:20070307  이름: 학생16    점수:60
학번:20070309  이름: 학생18    점수:60
학번:20070314  이름: 학생23    점수:61
학번:20070318  이름: 학생27    점수:61
학번:20070322  이름: 학생31    점수:61
학번:20070306  이름: 학생15    점수:62
학번:20070310  이름: 학생19    점수:64
학번:20070302  이름: 학생11    점수:66
학번:20070308  이름: 학생17    점수:68
학번:20070321  이름: 학생30점 점수:68
학번:20070330점 이름: 학생39    점수:69
학번:20070303  이름: 학생12    점수:70
학번:20070320점 이름: 학생29    점수:70
학번:20070323  이름: 학생32    점수:77
학번:20070313  이름: 학생22    점수:78
학번:20070304  이름: 학생13    점수:79
학번:20070324  이름: 학생33    점수:83
학번:20070326  이름: 학생35    점수:84
학번:20070327  이름: 학생36    점수:85
학번:20070311  이름: 학생20점 점수:88
학번:20070305  이름: 학생14    점수:89
학번:20070329  이름: 학생38    점수:89
학번:20070316  이름: 학생25    점수:90
학번:20070301  이름: 학생10    점수:95
학번:20070312  이름: 학생21    점수:96
학번:20070317  이름: 학생26    점수:97
학번:20070319  이름: 학생28    점수:97
학번:20070325  이름: 학생34    점수:98
학번:20070315  이름: 학생24    점수:99
학번:20070328  이름: 학생37    점수:99

TreeSet의 요약:
1요소는 중복되지 않으며, TreeSet은 정렬된 상태입니다.
2두 가지 정렬 방법:
(1를 통해 비교기를 정의한自定义 비교기 클래스를 정의합니다. 예를 들어 class Com implements Comparator{ } , compare(Object o1, Object o2메서드에서 비교 규칙을 정의합니다.
(2를 통해 요소 자체가 비교 가능하게 합니다.
단계: TreeSet에 추가할 요소가 Comparable 인터페이스를 구현하고 compareTo 메서드를 오버라이드합니다. 이 순서는 요소의 자연 순서이거나 기본 순서라고도 합니다.

방법1와 방법2의 차이는 :

두 가지 방법에는 장단점이 있으며, Comparable을 사용하면 간단합니다. Comparable 인터페이스를 구현한 객체는 바로 비교할 수 있는 객체가 됩니다. 하지만 원본 코드를 수정해야 합니다.

Comparator를 사용하는 장점은 원본 코드를 수정하지 않고 추가적인 비교기를 구현하는 것이며, 특정 사용자 정의 객체가 비교되어야 할 때 비교기와 객체를 함께 전달하여 크기를 비교할 수 있습니다. 또한 Comparator 내에서 사용자는 복잡하고 일반적인 로직을 구현할 수 있으며, 이를 통해 간단한 비교를 필요로 하는 특정 객체와 일치시킬 수 있습니다. 이렇게 하면 많은 중복 노력을 절약할 수 있습니다.

(2)를 사용하여HashSet을 통해 구현

package com.package1; 
import java.util.*; 
public class StuScore { 
  public static void main(String[] args) { 
    HashSet<Student> hs=new HashSet<Student>(); 
    //요소를 추가합니다 
    for(int i=20070301,j=1;i<=20070330;i++,j++) 
    { 
      hs.add(new Student(i,"동생"+j,(int)  
(40*Math.random()+60))); 
    } 
    ArrayList<Student>li=new ArrayList(hs); 
    Collections.sort(li, new Sortbygrade()); 
    for(Student ss:li) 
      System.out.println(ss); 
  } 
} 
//학생 클래스 
class Student  
{ 
  int num; 
  int grade; 
  String name; 
  public Student(int num, String name, int grade) 
  { 
    this.num=num; 
    this.name=name; 
    this.grade=grade; 
  } 
  public String toString(){ 
    //System.out.println("hi"); 
    return "학번:"+this.num+"\t"+"이름:"+this.name 
+"  "+"성적:"+this.grade; 
  } 
} 
class Sortbygrade implements Comparator{ 
  @Override 
  public int compare(Object o1, Object o2) { 
    Student s1=(Student) o1; 
    Student s2=(Student) o2; 
    if(s1.grade>s2.grade) 
      return 1; 
    if(s1.grade<s2.grade) 
      return -1; 
//   if(s1.grade==s2.grade) 
    return 0; 
  } 
} 

출력 결과는 다음과 같습니다:
학번:20070310 이름: 동생19    성적:60
학번:20070330 이름: 동생39    성적:62
학번:20070326 이름: 동생35    성적:63
학번:20070317 이름: 동생26    성적:64
학번:20070318 이름: 동생27    성적:65
학번:20070322 이름: 동생31    성적:65
학번:20070301 이름: 동생10    성적:67
학번:20070328 이름: 동생37    성적:68
학번:20070304 이름: 동생13    성적:68
학번:20070319 이름: 동생28    성적:69
학번:20070313 이름: 동생22    성적:70
학번:20070303 이름: 동생12    성적:71
학번:20070312 이름: 동생21    성적:71
학번:20070329 이름: 동생38    성적:72
학번:20070306 이름: 동생15    성적:72
학번:20070324 이름: 동생33    성적:72
학번:20070305 이름: 동생14    성적:75
학번:20070315 이름: 동생24    성적:75
학번:20070314 이름: 동생23    성적:78
학번:20070307 이름: 동생16    성적:80
학번:20070311 이름: 동생20    성적:81
학번:20070302 이름: 동생11    성적:83
학번:20070309 이름: 동생18    성적:84
학번:20070320 이름: 동생29    성적:85
학번:20070321 이름: 동생30    성적:85
학번:20070316 이름: 동생25    성적:86
학번:20070327 이름: 동생36    성적:90
학번:20070308 이름: 동생17    성적:94
학번:20070323 이름: 동생32    성적:94
학번:20070325 이름: 동생34    성적:95

HashSet의 요약:
1HashSet의 요소는 중복될 수 없습니다. 중복 추가되면 단 하나만 표시됩니다.
원리는 다음과 같습니다:
HashSet: 기본 데이터 구조는 해시 테이블입니다. 스레드 안전하지 않습니다. 동기화되지 않습니다.
2HashSet는 어떻게 요소의 유일성을 보장하는지요?
답: 요소의 두 메서드, hashCode와 equals를 통해 완료됩니다.
요소의 HashCode 값이 같을 때만 equals가 true인지 확인합니다. 요소의 hashCode 값이 다를 때는 equals를 호출하지 않습니다.
3、HashSet을 정렬하는 것, Set集合을 List集合으로 변환하여 Collections.Sort() 메서드를 사용하여 정렬을 수행합니다.

3、TreeMap을 사용하여 구현

package com.package1;  
import java.util.Comparator; 
import java.util.Iterator; 
import java.util.Set; 
import java.util.TreeMap; 
public class TestTreeMap { 
  public static void main(String[] args) { 
    //1.집합 생성 
    TreeMap<Student,Integer> tm=new TreeMap<Student,Integer>(); 
    for(int i=20070301,j=10;i<=20070330;i++,j++) 
    { 
      int grade=(int) (40*Math.random()+60); 
       //2、집합 객체에 요소 추가 
       tm.put(new Student(grade,"동생"+j),i); 
    } 
    //3.집합을 순회하고, 정렬이 완료되었습니다.  
    Set<Student> k=tm.keySet(); 
    Iterator<Student> it=k.iterator(); 
    while(it.hasNext()){ 
      Student key=it.next(); 
      Integer num=tm.get(key); 
      System.out.println("학생编号:"+num+"  "+"이름:"+key.name+"  "+"성적:"+key.grade); 
    } 
  } 
} 
class Student implements Comparable<Student>{ 
  int grade; 
  String name; 
  public Student(int grade,String name){ 
    this.grade =grade; 
    this.name=name; 
  } 
  @Override 
  public int compareTo(Student o) { 
    if(this.grade>o.grade)  
      return 1;  
      if(this.grade==o.grade)  
      { //성적이 같을 때는 이름에 따라 정렬됩니다 
       return this.name.compareTo(o.name);  
      }  
      return -1;  
  } 
} 

 출력 결과는 다음과 같습니다:

학번:20070303    이름: 학생12    성적:61
학번:20070323    이름: 학생32    성적:61
학번:20070317    이름: 학생26    성적:62
학번:20070309    이름: 학생18    성적:64
학번:20070301    이름: 학생10    성적:67
학번:20070304    이름: 학생13    성적:69
학번:20070322    이름: 학생31    성적:69
학번:20070328    이름: 학생37    성적:70
학번:20070305    이름: 학생14    성적:71
학번:20070319    이름: 학생28    성적:73
학번:20070321    이름: 학생30    성적:74
학번:20070310    이름: 학생19    성적:81
학번:20070315    이름: 학생24    성적:82
학번:20070307    이름: 학생16    성적:84
학번:20070330    이름: 학생39    성적:84
학번:20070312    이름: 학생21    성적:85
학번:20070324    이름: 학생33    성적:87
학번:20070306    이름: 학생15    성적:88
학번:20070308    이름: 학생17    성적:90
학번:20070327    이름: 학생36    성적:90
학번:20070318    이름: 학생27    성적:91
학번:20070316    이름: 학생25    성적:92
학번:20070320    이름: 학생29    성적:92
학번:20070314    이름: 학생23    성적:93
학번:20070313    이름: 학생22    성적:94
학번:20070302    이름: 학생11    성적:95
학번:20070325    이름: 학생34    성적:95
학번:20070329    이름: 학생38    성적:97
학번:20070326    이름: 학생35    성적:98
학번:20070311    이름: 학생20    성적:99

TreeMap의 요약:
1TreeMap은 기본적으로 키를 정렬하므로, 키에 사용자 정의 객체를 넣고, 학번을 대표하는 정수를 값에 넣을 수 있습니다. 키를 정렬할 때는 사용자 정의 객체의 특정 속성을 사용하여 정렬할 수 있습니다.
2Map 집합은 put() 메서드를 사용하여 요소를 추가합니다.
3Map 집합의 꺼내기 원리: map 집합을 set 집합으로 변환한 후 이터레이터를 통해 꺼냅니다. map 집합의 두 가지 꺼내기 방법:
(1Set<k> keySet:map에서 모든 키를 Set 집합에 저장합니다. set은 이터레이터를 가지고 있으므로 모든 키를 이터레이션 방식으로 꺼내고, get 메서드를 통해 각 키에 대한 값을 가져옵니다.
(2Set<Map.Entry<k,v>> entrySet:map 집합의 매핑 관계를 set 집합에 저장했습니다. 이 관계의 데이터 타입은 Map.Entry입니다.

이것이 본문의 전체 내용입니다. 많은 도움이 되길 바랍니다. 또한, 지지와 격려를 많이 해 주시길 바랍니다.

선언: 본문 내용은 인터넷에서 가져왔으며, 저작권자는 모두 소유합니다. 내용은 인터넷 사용자가 자발적으로 기여하고 업로드한 것이며, 사이트는 소유권을 가지지 않으며, 인공 편집 처리를 하지 않으며, 관련 법적 책임도 부담하지 않습니다. 저작권 침해 내용을 발견하면 이메일을 notice#w로 보내 주세요.3codebox.com에 이메일을 보내면(#을 @으로 변경하십시오.) 신고하시고 관련 증거를 제공하십시오. 확인되면 해당 사이트는 즉시 저작권 침해 내용을 제거합니다.

당신이 좋아할 만한 것