Java小朋友分班---yes or no键值对

题目描述

有两个幼儿园班级的小朋友排队时混在一起了,每位小朋友都知道自己跟前面一位小朋友是否为同一班级,请将同班的小朋友找出来。小朋友以整数编号区分,并带有一个是否与前一位小朋友同班的标识,同班用Y表示,不同班用N表示。

输入

输入的数据以空格分开,每个数据包含小朋友的编号和是否同班的标识,且以“/”分隔。

如:6/N 2/Y 3/N 4/Y,表示4位小朋友,其中2和6同班,2和3不同班,3和4同班。

其中,小朋友总数不超过999,每个小朋友的0<编号<=999,忽略输入格式错误问题。

输出

输出为两行,分别是两个班的小朋友编号,每行的小朋友编号之间用空格分开,且满足下列条件:

1.编号需按照大小升序排序,分班记录中的第一个编号小的排在第一行;

2.若只有一个班的小朋友,第二行则为空;

3.若输入不符合要求,则输出字符串ERROR。

用例

分班逻辑解析

分班解析

假设两个班分别为class1和class2.

如果前面一位小朋友在class1,看后面一个小朋友的标识位

  • 标识Y,则在class1,在同一班
  • 标识N,则在class2,不在同一班

如果前面一位小朋友在class2,看后面一个小朋友的标识位

  • 标识Y,则在class2,在同一班
  • 标识N,则在class1,不在同一班

需要校验的情况如下,打印输出ERROR:

  • 小朋友总数不超过999
  • 0<小朋友编号<=999
  • 同班标识只能是Y或N字符
  • 对于第一个小朋友的标识,理论上只能是N,因为他前面没有其他小朋友了。

打印要求

  • 一班、二班需要各自升序,且比较出第一个小朋友的编号较小的,则首先打印
  • 如果二班没有小朋友,则打印空行

Java源码

import java.util.StringJoiner;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;

public class KidsClassesSort {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入所有排队的小朋友的数据(例2/Y):");
        String[][] infos = Arrays.stream(sc.nextLine().split(" ")).map(s -> s.split("/")).toArray(String[][]::new);

        //校验小朋友的总数
        if(infos.length > 999){
            System.out.println("ERROR");
            return;
        }

        //创建class1和class2数组列表
        ArrayList<Integer> class1 = new ArrayList<>();
        ArrayList<Integer> class2 = new ArrayList<>();

        boolean isClass1 = false;

        //开始分班
        for (int i = 0; i < infos.length; i++) {
            String[] info = infos[i];//获取一个小朋友的编号和标识信息

            //校验小朋友的编号
            int id = Integer.parseInt(info[0]);//字符转化为整数
            if(id <= 0 || id > 999){
                System.out.println("ERROR");
                return;
            }

            //校验小朋友的标识
            String flag = info[1];
            if(!"Y".equals(flag) && !"N".equals(flag)){
                System.out.println("ERROR");
                return;
            }

            //校验第一个小朋友的标识是否为N
            if(i == 0 && "Y".equals(flag)){
                System.out.println("ERROR");
                return;
            }

            //按逻辑分班
            if("Y".equals(flag) && isClass1 || "N".equals(flag) && !isClass1){
                isClass1 = true;
                class1.add(id);
            }else {
                isClass1 = false;
                class2.add(id);
            }
        }

        //将分班后的小朋友编号按大小升序排序
        class1.sort((a,b) -> a - b);
        class2.sort((a,b) -> a - b);

        //将分班记录中第一个编号更小的排在第一行
        if(class1.isEmpty() || !class2.isEmpty() && class1.get(0) > class2.get(0)){
            ArrayList<Integer> tmp = class1;
            class1 = class2;
            class2 = tmp;
        }

        System.out.println("1班的小朋友编号:"+join(class1, " "));
        System.out.println("2班的小朋友编号:"+join(class2, " "));
    }

    //打印结果
    private static String join(ArrayList<Integer> list, String delimiter) {
        StringJoiner sj = new StringJoiner(delimiter);

        for(Integer i : list){
            sj.add(i + "");
        }

        return sj.toString();
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值