> Java > java지도 시간 > 본문

다양한 문제 해결 아이디어가 포함된 Java 컬렉션 프레임워크 질문

高洛峰
풀어 주다: 2017-01-23 16:57:17
원래의
1667명이 탐색했습니다.

질문: 학생 ID가 20070301-20070330인 학급에는 30명이 있습니다. 그들은 모두 Java 프로그래밍 과정을 수강했습니다. 모든 학생의 점수가 제공됩니다(60-100 범위에서 임의의 숫자가 생성될 수 있음). 이 수업을 다음 학생에게 배정하는 프로그램을 작성하세요. 각 학생의 점수가 낮은 것부터 높은 것 순서대로 인쇄됩니다.

요구 사항: List, Map, Set을 각각 사용하여 구현합니다. 인쇄된 정보에는 학번, 이름, 성적이 포함됩니다.

1. List 컬렉션을 사용하여

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;     
      
  } 
    
}
로그인 후 복사

구현 결과는 그림과 같습니다.

一道Java集合框架题 多种解题思路

List 컬렉션 프레임워크 요약 :

1. List 컬렉션은 실제로 동적 배열이며 반복 없이 for 루프를 통해 요소를 직접 꺼낼 수 있습니다.
2. List 컬렉션을 출력할 때 컬렉션에 저장된 객체의 toString() 메서드가 기본적으로 호출되므로 클래스에서 재정의해야 합니다.
toString() 메서드를 재정의하지 않는 경우

for(int i=0;i<lt.size();i++)
{
  Student s=lt.get(i);
  System.out.println("学号:"+s.num+"  姓名:"+s.name+"  成绩:"+s.grade);
}
로그인 후 복사

를 사용해야 합니다. 3. List 컬렉션을 정렬하려면 Collections 도구 클래스의 도움이 필요합니다. Collections.Sort(목록, 새 비교 장치()) 메서드. 따라서 비교기 클래스를 사용자 정의하고 고유한 비교 규칙을 정의해야 합니다.

2. Set 컬렉션을 사용하여
구현 (1) TreeSet을 사용하여

package com.package1;
  
import java.util.*;
  
public class StuScore {
  
public static void main(String[] args) {
  
  TreeSet<Student> ts=new TreeSet<Student>(new Com());
  //添加元素进去
  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 이름: Classmate 16 점수: 60
학생번호: 20070309 이름: Classmate 18 점수: 60
학생번호: 20070314 이름: Classmate 23 점수: 61
학생 ID: 20070318 이름: Classmate 27 점수: 61
학생 ID: 20070322 이름: Classmate 31 점수: 61
학생 ID: 20070306 이름: Classmate 15 점수: 62
학생 ID: 20070310 이름: Classmate 19 점수: 64
학생 ID: 20070302 이름: Classmate 11 점수: 66
학생 ID: 20070308 이름: Classmate 17 점수: 68
학생 ID: 20070321 이름: Classmate 30 점수: 68
학생 ID :20070330 이름: Classmate 39 점수: 69
학생 ID: 20070303 이름: Classmate 12 점수: 70
학생 ID: 20070320 이름: Classmate 29 점수: 70
학생 ID: 20070323 이름: Classmate 32 점수 : 77
학생 ID: 20070313 이름: Classmate 22 점수: 78
학생 ID: 20070304 이름: Classmate 13 점수: 79
학생 ID: 20070324 이름: Classmate 33 점수: 83
학생 ID: 20070326 이름: Classmate 35 점수: 84
학생번호: 20070327 이름: Classmate 36 점수: 85
학생번호: 20070311 이름: Classmate 20 점수: 88
학생번호: 20070305 이름: Classmate 14 점수: 89
학생 ID: 20070329 이름: Classmate 38 점수: 89
학생 ID: 20070316 이름: Classmate 25 점수: 90
학생 ID: 20070301 이름: Classmate 10 점수: 95
학생 ID: 20070312 이름 : Classmate 21 점수: 96
학생번호: 20070317 이름: Classmate 26 점수: 97
학생번호: 20070319 이름: Classmate 28 점수: 97
학생번호: 20070325 이름: Classmate 34 점수: 98
학생번호: 20070315 이름: Classmate 24 점수: 99
학생번호: 20070328 이름: Classmate 37 점수: 99

TreeSet 요약:
1. .
2. 두 가지 정렬 방법:
(1) Com ImplementsComparator{ } 클래스와 같은 비교기 클래스를 사용자 정의하고, Compare(Object o1, Object o2) 메서드를 구현하고, 그 안에 비교 규칙을 정의합니다.
(2) 요소 자체를 비교하게 만듭니다.
단계: TreeSet에 추가된 요소에 대한 Comparable 인터페이스를 구현하고 CompareTo 메서드를 재정의합니다. 이 순서는 요소의 자연 순서이기도 하며 기본 순서라고도 합니다.

방법 1과 방법 2의 차이점:

두 방법 모두 장점과 단점이 있습니다. 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的总结:
1、HashSet中的元素不可以重复,如果重复添加,则只会显示一个。
原理如下:
HashSet:底层数据结构是哈希表。是线程不安全的。不同步。
2、HashSet是如何保证元素唯一性的呢?
答:是通过元素的两个方法,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; 
  
  }
    
  
    
}
로그인 후 복사

   

 输出结果为:

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

TreeMap 요약:
1. TreeMap은 기본적으로 키를 정렬하므로 사용자 정의 개체를 배치할 수 있습니다. Enter 키와 학생 수를 나타내는 정수를 값에 넣습니다. 키별로 정렬할 때 정렬할 사용자 정의 개체의 속성을 지정할 수 있습니다.
2. Map 컬렉션은 put() 메서드를 사용하여 요소를 추가합니다.
3. 지도 컬렉션 추출 원리: 지도 컬렉션을 세트 컬렉션으로 변환합니다. 반복자를 통해 꺼내십시오. 맵 세트를 검색하는 두 가지 방법:
(1) Set keySet: 맵의 모든 키를 Set 컬렉션에 저장합니다. 세트에는 반복자가 있기 때문입니다. get 메소드에 따라 모든 키를 반복적으로 검색할 수 있습니다. 각 키에 해당하는 값을 가져옵니다.
(2) Set>entrySet: 지도 컬렉션의 매핑 관계를 집합 컬렉션에 저장하며 이 관계의 데이터 유형은 Map.Entry

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되기를 바랍니다. 또한 모든 분들이 PHP 중국어 웹사이트를 지지해 주시길 바랍니다.

더 많은 Java 컬렉션 프레임워크에 대한 질문과 다양한 문제 해결 아이디어를 보려면 PHP 중국어 웹사이트에서 관련 기사를 주목하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿