试题编号: | 201403-3 |
试题名称: | 命令行选项 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。 输入格式 输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。 输出格式 输出有 N 行。其中第 i 行以"Case i:" 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。 样例输入 albw:x 样例输出 Case 1: -a -l |
大模拟题,看别人的代码写的。
package Thre;
import java.util.Scanner;
//time:2019年9月12日上午8:58:39
public class 命令行选项_2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
Aq[] argues = new Aq[26];
for (int i = 0; i < 26; i++)
argues[i] = new Aq();
char[] rule = sc.nextLine().toCharArray();
int n = Integer.parseInt(sc.nextLine());
for (int i = 0; i < rule.length; i++) {
if (rule[i] == ':') {
argues[rule[i - 1] - 'a'].hasPar = true;
} else {
argues[rule[i] - 'a'].isAppear = true;
}
}
StringBuilder[] result = new StringBuilder[n];
for (int i = 0; i < n; i++) {
result[i] = new StringBuilder("Case " + (i + 1) + ": ");
boolean[] isAppear = new boolean[26];
String[] par = new String[26];
String[] in = sc.nextLine().split(" ");
for (int j = 1; j < in.length;) {
// 是参数
if (in[j].length() != 2 || in[j].charAt(0) != '-' || in[j].charAt(1) - 'a' < 0
|| in[j].charAt(1) - 'a' > 25 || !argues[in[j].charAt(1)-'a'].isAppear) {
break;
}
char c = in[j].charAt(1);
if (argues[c - 'a'].hasPar && (j + 1) < in.length) {// 如果命令行有参数,那么对应的参数为in[j+1];
isAppear[c - 'a'] = true;
par[c - 'a'] = in[j + 1];
j += 2;
} else {// 命令行命令无参数
isAppear[c - 'a'] = true;
j++;
}
}
for (int j = 0; j < 26; j++) {
if (isAppear[j]) {
char temp = (char) ('a' + j);
result[i].append("-" + temp + " ");
if (argues[j].hasPar) {
result[i].append(par[j] + " ");
}
}
}
}
for (int i = 0; i < n; i++) {
System.out.println(result[i].toString().trim());
}
}
}
class Aq {
boolean hasPar;
boolean isAppear;
}