CSP2014203-3(命令行选项)(Java100分)

问题描述
  请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。
  选项有两类:带参数的选项和不带参数的选项。一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如"-a" 或"-b"。而带参数选项则由两个由空格分隔的字符串构成,前者的格式要求与无参数选项相同,后者则是该选项的参数,是由小写字母,数字和减号组成的非空字符串。
  该命令行工具的作者提供给你一个格式字符串以指定他的命令行工具需要接受哪些选项。这个字符串由若干小写字母和冒号组成,其中的每个小写字母表示一个该程序接受的选项。如果该小写字母后面紧跟了一个冒号,它就表示一个带参数的选项,否则则为不带参数的选项。例如, “abⓂ️” 表示该程序接受三种选项,即"-a"(不带参数),"-b"(带参数), 以及"-m"(带参数)。
  命令行工具的作者准备了若干条命令行用以测试你的程序。对于每个命令行,你的工具应当一直向后分析。当你的工具遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时,分析就停止。命令行剩余的未分析部分不构成该命令的选项,因此你的程序应当忽略它们。
输入格式
  输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。
  输入的第二行是一个正整数 N(1 ≤ N ≤ 20),表示你需要处理的命令行的个数。
  接下来有 N 行,每行是一个待处理的命令行,它包括不超过 256 个字符。该命令行一定是若干个由单个空格分隔的字符串构成,每个字符串里只包含小写字母,数字和减号。
输出格式
  输出有 N 行。其中第 i 行以"Case i:" 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。
样例输入
albw:x
4
ls -a -l -a documents -b
ls
ls -w 10 -x -w 15
ls -a -b -c -d -e -l
样例输出
Case 1: -a -l
Case 2:
Case 3: -w 15 -x
Case 4: -a -b
CSP第三题一般都是字符串的处理题,这种题简单,但耗时长,而且坑多。有很多你发现不了的坑,导致你认为你应该得100分的,所以你得了0分。
这种题真的是需要的变量太多了,所以我的代码写的有点乱,建议大家看一下我的思路,然后自己写吧,毕竟没涉及算法。

思路:

1–>先自定义一个Command类(属性为:1.char 选项名称,2,boolean是否带参数),,然后重写equal方法。
2–>申明一个List类型的对象,用于存储命令。
3–>把输入的第一行解析,把每个命令加到List 的对象(假设为list)里。
4–>开始解析每一行命令。
5–>把命令复制给一个字符串,然后把字符串以空格分割成数组。(假设这个数组是arr)
6–>自定义一个类SaveCom 用于存放选项,这个类应该实现Comparable接口,因为输出时要按照字典序从小到大输出,这个类和Command相似。不过还是有用的。(属性为:1.char 选项名称,2,boolean是否带参数 , 3 String类型的参数内容)。然后重写equal和compareTo方法
7–>再申明一个List 假设为(list2)。
8–>arr[0]题目已经告诉不需要管,然后从arr[1]开始解析,如果list里有这个选项,然后看这个选项是否需要参数,如果不需要,把这个加入到list2里,在往进加时应该注意,如果list2已经有这个选项,应该删除,然后再加入,如果没有,直接加入即可。如果需要参数,则判断arr[j+1]是否只包含小写字母,数字和减号,如果是,加入到list2里,如果不是,则该行命令解析结束。
9–>把一行命令解析完成后,对list2进行排序,用Collections.sort(list2)进行排序,排序完成后按要求依次输出每一个选项。
10–>最后一行需要单独考虑

如果看不懂程序,直接调试。

package csp201403;
import java.util.Scanner;
import java.util.Set;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

public class CommandOptions {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		String s=sc.nextLine();
		List<Command> l=new ArrayList<Command>();
		for(int i=0;i<s.length();i++) {//输入命令
			if(i!=s.length()-1) {
				if(s.charAt(i+1)!=':'){
					Command c=new Command(s.charAt(i),false);
					l.add(c);
				}
				else {
					Command c=new Command(s.charAt(i),true);
					l.add(c);
					i++;
				}
			}
			else {
				Command c=new Command(s.charAt(i),false);
				l.add(c);
			}
		}
		int n=Integer.parseInt(sc.nextLine());
		for(int i=0;i<n;i++) {
			String sTemp=sc.nextLine();
			System.out.print("Case "+(i+1)+":");
			String arrSTemp[]=sTemp.split(" ");
			List<SaveCom> comList=new ArrayList<SaveCom>();
			for(int j=1;j<arrSTemp.length;j++) {
				if(arrSTemp[j].length()==2&&arrSTemp[j].charAt(0)=='-'&&l.contains(new Command(arrSTemp[j].charAt(1),false))&&j!=arrSTemp.length-1) {//如果这个命令存在,而且j!=arrStemp.length-1,如果j==arrStemp.length-1 如果该命令是不带参数的选项,那就可以直接输出,否则,如果该参数是带参数的选项,因为他已经是最后一位,所以没有参数和他匹配,那么应该结束搜索
					int index=l.indexOf(new Command(arrSTemp[j].charAt(1),false));
					Command tt=l.get(index);
					if(tt.isHaveParameters==false) {//该命令不要参数
						SaveCom save=new SaveCom(arrSTemp[j].charAt(1),false, null);
						if(comList.contains(save)) {
							comList.remove(save);
							comList.add(save);
						}
						else {
							comList.add(save);
						}
					}
					else {//该命令需要参数
						int flag=1;
						for(int k=0;k<arrSTemp[j+1].length();k++) {
							if(arrSTemp[j+1].charAt(k)=='-') {
								
							}
							else if(arrSTemp[j+1].charAt(k)>='0'&&arrSTemp[j+1].charAt(k)<='9') {
								
							}
							else if(arrSTemp[j+1].charAt(k)>='a'&&arrSTemp[j+1].charAt(k)<='z') {
								
							}
							else {
								flag=0;
								break;
							}
						}
						if(flag==1) {
							SaveCom save=new SaveCom(arrSTemp[j].charAt(1),true, arrSTemp[j+1]);
							if(comList.contains(save)) {
								comList.remove(save);
								comList.add(save);
							}
							else {
								comList.add(save);
							}
							j++;
						}
						else {
							break;
						}
					}
				}
				else if(arrSTemp[j].length()==2&&arrSTemp[j].charAt(0)=='-'&&l.contains(new Command(arrSTemp[j].charAt(1),false))&&j==arrSTemp.length-1) {
					int index=l.indexOf(new Command(arrSTemp[j].charAt(1),false));
					Command tt=l.get(index);
					if(tt.isHaveParameters==false) {//该命令不要参数
						SaveCom save=new SaveCom(arrSTemp[j].charAt(1),false, null);
						if(comList.contains(save)) {
							comList.remove(save);
							comList.add(save);
						}
						else {
							comList.add(save);
						}
					}
					else {
						break;
					}
				}
				else {
					break;
				}
			}
			Collections.sort(comList);
			for(int j=0;j<comList.size();j++) {
				comList.get(j).output();
			}
			System.out.println();
		}
	}
}
class SaveCom implements Comparable<SaveCom>{
	char command;
	boolean isHaveParameters;
	String parameter;
	public SaveCom(char command, boolean isHaveParameters, String parameter) {
		super();
		this.command = command;
		this.isHaveParameters = isHaveParameters;
		this.parameter = parameter;
	}
	@Override
	public int compareTo(SaveCom o) {
		// TODO Auto-generated method stub
		return command-o.command;
	}
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		return this.command==((SaveCom)obj).command;
	}
	public void output() {
		if(isHaveParameters==false) {
			System.out.print(" -"+command);
		}
		else {
			System.out.print(" -"+command+" "+parameter);
		}
		//System.out.println();
	}
}
class Command{
	char command;
	boolean isHaveParameters;
	public Command(char command, boolean isHaveParameters) {
		this.command = command;
		this.isHaveParameters = isHaveParameters;
	}
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		if(this.command==((Command)obj).command) {
			return true;
		}
		else {
			return false;
		}
	}
}

欢迎指正!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值