java容器与算法pta以及初识键值对

6-1 将学生对象按照学号降序排序

请阅读程序并补全源代码:先从键盘录入5个学生的数据,保存到容器对象ar中,然后按照学号降序排序之后输出。

本程序将下面的学生类Student对象按照学号降序排序:

import java.util.*;

class Student {
    String number;
    String name;
    float score;

    // Constructor
    Student(String number1, String name1, float score1) {
        number = number1;
        name = name1;
        score = score1;
    }

    // Used to print student details in main()
    public String toString() {
        return this.number + " " + this.name + " " + this.score;
    }
}

public class Main {
    public static void main(String[] args) {
        ArrayList<Student> ar = new ArrayList<Student>();


/* 请在这里补全代码,使程序完成指定的功能。 */

输入样例:

在这里输入5个学生的记录:

04031021 Zhang3 84
04031013 Li4    73
04031018 Wang5  98
04031038 Ma6    65
04031029 Chen7  96

输出样例:

04031038 Ma6 65.0
04031029 Chen7 96.0
04031021 Zhang3 84.0
04031018 Wang5 98.0
04031013 Li4 73.0

 

Scanner scanner = new Scanner(System.in);
        for (int i = 0; i < 5; i++) {
            String number = scanner.next();
            String name = scanner.next();
            float score = scanner.nextFloat();
            ar.add(new Student(number, name, score));
        }

        ar.sort((s1, s2) -> s2.number.compareTo(s1.number)); /*这是排序*/

        for (Student student : ar) {
            System.out.println(student);
        }
  }
}

 

7-1 人名地名排序

从键盘输入若干人名、地名或者国家名,要求按照升序排序之后输出。

输入格式:

7(表示将输入7个人名或者地名)

Zhang3

Li4

Wang5

Ma6

Chen7

Shu8

Ren9

输出格式:

Chen7

Li4

Ma6

Ren9

Shu8

Wang5

Zhang3

输入样例:

5
Xi'an
HanZhong
BaoJi
Yan'an
WeiNan

输出样例:

BaoJi
HanZhong
WeiNan
Xi'an
Yan'an

 这是一个不用容器的方法

import java.util.Scanner;
import java.util.Arrays;
public class Main{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        int a=scanner.nextInt();
        String []name=new String[a];
        int i;
        for(i=0;i<a;i++){
            String n=scanner.next();
            name[i]=n;
        }
        Arrays.sort(name);/*升序排序*/
        for(i=0;i<a;i++){
            System.out.println(name[i]);
        }
    }
}

 这里是一个用容器的方法

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class Main{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        List<String>names=new ArrayList<>();/*创建一个容器,用于存储String类型的数据*/
        for(int i=0;i<n;i++){
            names.add(scanner.next());
        }
        names.sort(Comparator.naturalOrder());/*排序*/
        for(String name:names){
            System.out.println(name);
        }
    }
}

 

7-3 电话号码同步(Java)

文件phonebook1.txt和phonebook2.txt中有若干联系人的姓名和电话号码。请你设计一个程序,将这两个文件中的电话号码同步。(所谓同步,就是将两个文件中的电话号码合并后剔除相同的人名和电话号码。请将同步后的电话号码按照姓名拼音顺序排序后保存到文件phonebook3.txt中。)

由于目前的OJ系统暂时不能支持用户读入文件和写文件,我们编写程序从键盘输入文件中的姓名和电话号码,当输入的单词为end时,表示文件结束。将同步后的电话号码按照姓名拼音顺序排序后输出。

输入格式:

张三 13012345678

李四 13112340000

王五 13212341111

马六 13312342222

陈七 13412343333

孙悟空 13512345555

end (表示文件phonebook1.txt结束)

张三 13012345678

孙悟空 13512345555

王五 13212341111

陈七 13412343333

唐三藏 13612346666

猪悟能 13712347777

沙悟净 13812348888

end (表示文件phonebook2.txt结束)

输出格式:

陈七 13412343333

李四 13112340000

马六 13312342222

沙悟净 13812348888

孙悟空 13512345555

唐三藏 13612346666

王五 13212341111

张三 13012345678

猪悟能 13712347777

输入样例:

Zhang3 13012345678
Li4 13112340000
Wang5 13212341111
Ma6 13312342222
Chen7 13412343333
SunWuKong 13512345555
end
Zhang3 13012345678
SunWuKong 13512345555
Wang5 13212341111
Chen7 13412343333
TangSanZang 13612346666
ZhuWuneng 13712347777
ShaWuJing 13812348888
end

输出样例:

Chen7 13412343333
Li4 13112340000
Ma6 13312342222
ShaWuJing 13812348888
SunWuKong 13512345555
TangSanZang 13612346666
Wang5 13212341111
Zhang3 13012345678
ZhuWuneng 13712347777
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        TreeMap<String,Long>map=new TreeMap<>(((o1,o2)->{
            String s1,s2;
            s1=(String)o1;
            s2=(String)o2;
            return s1.compareTo(s2);
        }));
        String pinyin;
        String[] data=new String[2];
        while(true){
            pinyin=scanner.nextLine();
            if(pinyin.substring(0,3).equals("end")){
                break;
            }
            data=pinyin.split(" ");
            map.put(data[0],Long.parseLong(data[1]));
        }
        while(true){
            pinyin=scanner.nextLine();
            if(pinyin.substring(0,3).equals("end")){
                break;
            }
            data=pinyin.split(" ");
            map.put(data[0],Long.parseLong(data[1]));
        }
        Set<String>keys=map.keySet();
        for(String key:keys){
            System.out.println(key+" "+map.get(key));
        }
    }
}

 

7-3 找出足球赛对阵方

2014年世界杯足球赛在6月24日星期二小组赛赛程如下所示:
Australian VS Spain; Holland VS Chile; Cameroon VS Brazil; Croatia VS Mexico
请你编写一个简单的C++或Java程序,当输入其中任何一个国家的名字就能找出与其对阵的国家名。例如,输入“Holland”,就能找到对阵方是“Chile”。

输入格式:

Holland

输出格式:

Holland team's rival is Chile.

输入样例:

Germany

输出样例:

Germany's team has no match today.

 下面先看一个用switch case语句解决的代码

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        switch(name){
            case "Australian":
                System.out.print(name+" team's rival is Spain");
                break;
            case "Spain":
                System.out.print(name+" team's rival is Australian");
                break;
            case "Holland":
                System.out.print(name+" team's rival is Chile.");
                break;
            case "Chile":
                System.out.print(name+" team's rival is Holland.");
                break;
            case "Cameroon":
                System.out.print(name+" team's rival is Brazil.");
                break;
            case "Brazil":
                System.out.print(name+" team's rival is Cameroon.");
                break;
            case "Croatia":
                System.out.print(name+" team's rival is Mexico.");
                break;
            case "Mexico":
                System.out.print(name+" team's rival is Croatia.");
                break;
            default:
                System.out.print(name+"'s team has no match today.");
        }
    }
}

 一定要记得看清题目要求,结尾是否需要加上句号。

下来看看这个用容器解决这个问题的代码

import java.util.Scanner;
import java.util.Map;
import java.util.HashMap;
public class Main{
    public static void main(String[] args){
        Map<String,String>matches=new HashMap<>();
        matches.put("Australian","Spain");
        matches.put("Holland","Chile");
        matches.put("Cameroon","Brazil");
        matches.put("Croatia","Mexico");
        matches.put("Spain","Australian");
        matches.put("Chile","Holland");
        matches.put("Brazil","Cameroon");
        matches.put("Mexico","Croatia");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        if(matches.containsKey(name)){
            System.out.print(name+" team's rival is "+matches.get(name)+".");
        }
        else{
            System.out.print(name+" team has no match today.");
        }
    }
}

 Map<String, String> matches = new HashMap<>();
        matches.put("Australian", "Spain");
        matches.put("Holland", "Chile");
        matches.put("Cameroon", "Brazil");
        matches.put("Croatia", "Mexico");

这部分代码是创建了一个  Map  对象  matches  ,并向其中添加了四组键值对。
 
键分别是四个国家的名称("Australian"、"Holland"、"Cameroon"、"Croatia"),而对应的值则是它们在该赛程中的对阵国家的名称("Spain"、"Chile"、"Brazil"、"Mexico")。这样就可以通过键(国家名称)快速地获取到其对阵的国家名称。

在 Java 中,键值对主要通过 Map 接口及其实现类来实现。
 
以下是对 Java 键值对的详细解释:

概念:
 
- 键(Key):用于唯一标识一个值。以上题为例(是四个国家的名称("Australian"、"Holland"、"Cameroon"、"Croatia"))
- 值(Value):与键相关联的数据。(以上题为例是对阵国家的名称("Spain"、"Chile"、"Brazil"、"Mexico")
 
常见实现类:
 
-  HashMap :基于哈希表实现,查找、插入、删除效率较高,但不保证元素的顺序。
-  TreeMap :基于红黑树实现,会对键进行排序,可实现有序的键值对存储。
 
主要特点和操作:
 
- 添加元素:使用 put(key, value) 方法。
- 获取元素:通过 get(key) 方法根据键获取对应的值。
- 检查键是否存在: containsKey(key) 方法。
- 删除元素: remove(key) 方法。
- 获取键集合: keySet() 方法返回包含所有键的集合。
- 获取值集合:通过遍历 Map 获取所有值。
 
在实际应用中,键值对结构非常灵活,可以方便地根据特定键快速查找、存储和管理相关联的值,适用于各种场景,如配置信息存储、缓存等。

在 Java 中,可以使用 Map 接口来实现键值对的存储和操作。常见的实现类有 HashMap 、 TreeMap 等。
 
以下是一个简单的示例代码,展示如何使用 HashMap 存储键值对并进行一些基本操作:
 


import java.util.HashMap;
import java.util.Map;

public class JavaKeyValueExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();

        // 添加键值对
        map.put("key1", 10);
        map.put("key2", 20);

        // 获取值
        int value1 = map.get("key1");
        int value2 = map.get("key2");

        // 检查键是否存在
        boolean containsKey = map.containsKey("key3");

        // 遍历键值对
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println("Key: " + key + ", Value: " + value);
        }
    }
}

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值