将一个csv格式的数据文件中包含有单元格引用的内容替换为对应单元格内容的实际值。Comma seprated
values(CSV)逗号分隔值,csv格式的数据文件使用逗号作为分隔符将各单位的内容进行分隔。
输入:
1.输入只有一行数据,用逗号分隔每个单元格,行尾没有逗号。最多26个单元格,对应编号A-Z。
2.每个单元格的内容包含字母和数字,以及使用<> 分隔的单元格引用,例如:表示引用第一个单元的值。
3.每个单元格的内容,在替换前和替换后均不超过100个字符。
4.引用单元格的位置不受限制,运行排在后面的单元格被排在前面的单元格引用。
5.不存在循环引用的情况,比如下面这种场景是不存在的:
A单元格:aCd8u
B单元格:kAydzqo
6.不存在多重<> 的情况,一个单元格只能引用一个其他单元格。比如下面这种场景是不存在的:
A单元格:aCd8u
B单元格:kAydzqo
C单元格:y>d
输出:输出所有单元格展开的内容,单元格之间用逗号分隔。
处理过程中出现错误时,输出字符串“-1”表示出错。
用例1
输入:1,2<A>00
输出:1,2100
说明:第二个单元中有对A单元的引用,A单元格的值为1,替换时,将A单元的内容替代的位置,并和其他内容合并
用例2
输入:1<B<2,1
输出:-1
说明:第一个单元中有错误的单元格引用方式,输出-1
public class DataUnitReplace数据单元的变量替换 {
public static void main(String[] args) throws Exception {
//创建Scanner对象读取输入
Scanner in = new Scanner(System.in);
//读取输入,并将其存储在input_str
String inputStr = in.nextLine();
String[] strArr = inputStr.split(",");
//创建一个hashmap,用于存储每个单元格的值 键是单元格标识(A-z)
HashMap<Character, String> datas = new HashMap<>();
for (int i = 0; i < strArr.length; i++) {
datas.put((char) ('A' + i), strArr[i]);
}
//创建一个StringBuiler对象,构建输出对象
StringBuilder result = new StringBuilder();
//遍历每个单元格
for (String data : datas.values()) {
//查找"<"和">"的位置
int valPrefix = data.indexOf("<");
int valSuffix = data.indexOf(">");
//如果单元格不包含"<"和">" 则直接将其输出
if (valPrefix == -1 && valSuffix == -1) {
result.append(data).append(",");
}
//如果单元格包含"<"和">",但格式不正确,输出-1并结束
else if (valPrefix == -1 || valSuffix == -1 || valPrefix > valSuffix || valSuffix - valPrefix != 2) {
//异常
System.out.println(-1);
return;
}
//如果单元格包含正确"<"和">",将其替换为实际的单元格值,并将处理后的单元格添加到结果字符中
else {
// 正常情况替换即可
result.append(data, 0, valPrefix)
.append(datas.get(data.charAt(valPrefix + 1)))
.append(data.substring(valSuffix + 1))
.append(",");
}
}
//注意最后输出删除掉末尾逗号
System.out.println(result.substring(0, result.length() - 1));
}
}