학교/2-2학기(Java)

[텀프로젝트] 11/15 기록

C0MPAS 2024. 11. 15. 22:55

11/14 코드

https://jh4995.tistory.com/626

 

[텀프로젝트] 11/14 기록

11/11(월) 과제로 제출한 코드import java.util.*;import java.io.*;public class MileageManager { public static void main(String[] args) { HashMap map = new HashMap(); Scanner sc = new Scanner(System.in); System.out.println("*** 마일리지 관리

jh4995.tistory.com


11/15 코드

- .getOrDefault 메서드를 파일로부터 초기 마일리지를 읽어오는 과정에서 뿐만 아니라

   control_Mileage()에도 그대로 적용하여서 마일리지의 누적, 합산, 차감 과정에 사용하는 것으로 수정

 

- 가장 마일리지가 높은 고객을 출력하는 과정을 추가함

   Collections클래스의 .max()메소드를 활용

- GridLayout을 활용해 최종 마일리지를 출력하는 과정을 추가함

   p.535의 GridLayout 활용 예제 참고

   grid = new GridLayout( )으로 크기를 설정하는 과정에서 mileageMap.size() 활용을 생각하지 못해서 골치아팠음

   JLabel에 key와 value를 넘기는 과정에서 keySet()으로는 한계가 있어서, entrySet()으로 변경하여서 활용

import java.util.*;
import java.io.*;
import javax.swing.*;
import java.awt.*;

public class MileageManager extends JFrame{
    HashMap<String, Integer> mileageMap = new HashMap<>();

    public static void main(String[] args) {
        System.out.println("*** 마일리지 관리 프로그램입니다.***");

        MileageManager manager = new MileageManager();        
        manager.get_Mileage_From_File();
        manager.control_Mileage();
        manager.highest_Mileage();
        manager.showGridLayout();
        
        System.out.println("프로그램을 종료합니다.");
    }
    
    
    // 1. mileage.txt 파일로부터 초기 마일리지 데이터 읽어오기
    public void get_Mileage_From_File() {
        try{
        	File file = new File("C:\\tempjava\\mileage.txt");
        	Scanner sc = new Scanner(file);
        	
            while (sc.hasNext())
            {
                String name = sc.next();
                if (name.equals("그만"))
                {
                	break;
                }
                int mileage = sc.nextInt();
                mileageMap.put(name, mileageMap.getOrDefault(name, 0) + mileage);
                // getOrDefault 메소드 추가 활용
            }
            sc.close();
        } 
        
        catch (FileNotFoundException e)
        {
        	System.out.println("FileNotFoundException");
        }
        catch (IOException e)
        {
            System.out.println("IOException");
        }
        catch (Exception e)
        {
        	System.out.println("Exception occured");
        }

        // 초기 마일리지 출력
        System.out.println("\n초기 마일리지 정보:");
        show_Mileage();
    }


    // 2. 마일리지 누적, 합산, 차감 / 새로운 이름과 마일리지 추가 / 검색 기능
    public void control_Mileage() {
       Scanner sc = new Scanner(System.in);
       
       while (true)
       {
           System.out.print("\n이름과 마일리지>> ");
           
           String name = sc.next();
           if(name.equals("그만"))
           {
        	   break;
           }
           int mileage = sc.nextInt();
           
           mileageMap.put(name, mileageMap.getOrDefault(name, 0) + mileage);
           // getOrDefault 메소드 추가 활용
       }

       // 최종 마일리지 출력
       System.out.println("\n최종 마일리지 정보:");
       show_Mileage();

       // 검색 기능
       while (true)
       {
           System.out.print("\n검색할 이름>> ");
           
           String name = sc.next();
           if (name.equals("그만"))
           {
        	   break;
           }
           Integer mileage = mileageMap.get(name);
           
           if (mileage == null)
           {
               System.out.println(name + " 고객은 마일리지가 없습니다.");
           } 
           else
           {
               System.out.println(name + "의 마일리지: " + mileage);
           }
       }       
       sc.close();
    }


    // 3. (이름:마일리지) 형태로 모든 마일리지 정보 출력
    public void show_Mileage() {
    	Set<String> keys = mileageMap.keySet();
    	Iterator<String> it = keys.iterator();
    	while(it.hasNext())
    	{
    		String name = it.next();
    		Integer mileage = mileageMap.get(name);
    		System.out.print("(" + name + ":" + mileage +")");
    	}		
        System.out.println();
    }

    
    // 4. 검색까지 종료된 이후, 프로그램 종료 전에, 가장 마일리지가 높은 고객을 출력
    public void highest_Mileage() {
    	int maxMileage = Collections.max(mileageMap.values());
    	String maxName = null;
    	for(String name : mileageMap.keySet())
    	{
    		if(mileageMap.get(name) == maxMileage)
    		{
    			maxName = name;
    			break;
    		}
    	}   	
    	System.out.println("\n가장 마일리지가 높은 고객은 " + maxName + "입니다.");
    }
    
    
    // 5. GridLayout을 이용해서 출력
    public void showGridLayout() {
    	setTitle("최종 마일리지 정보");
    	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	
    	GridLayout grid = new GridLayout(mileageMap.size()+1, 2);
    	grid.setVgap(5);
    	
    	Container c = getContentPane();
    	c.setLayout(grid);
    	c.add(new JLabel("고객 이름"));
    	c.add(new JLabel("마일리지"));
    	
    	// entrySet() 추가 활용
    	for(Map.Entry<String, Integer> entry : mileageMap.entrySet())
    	{
    		c.add(new JLabel(entry.getKey()));
    		c.add(new JLabel(String.valueOf(entry.getValue())));
    	}
    	
    	setSize(400, 300);
    	setVisible(true);
    }
    
}