题八:数据单元的变量替换

题目:
将一个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  1,2<A>00
输出 1  1,2100
说明:第二个单元中有对A单元的引用,A单元格的值为1,替换时,将A单元的内容替代的位置,并和其他内容合并

示例2:
输入:1 <B<12,1
输出:1 -1
说明:第一个单元中有错误的单元格引用方式,输出-1

import java.util.Scanner;
import java.util.HashMap;

public class cellReplace {

   public static void main(String[] args) throws Exception {

     //创建Scanner对象读取输入
      Scanner in = new Scanner(System.in);
     //读取输入,并将其存储在input_str
     String input_str = in.nextLine();
     String[] tmp = input_str.split(",");
     
    //创建一个hashmap,用于存储每个单元格的值 键是单元格标识(A-z)
   HashMap<Character,String> cells = new HashMap<>();
   for(int i=0;i<tmp.length;i++){
         cells.put((char)('A'+i),tmp[i]);
    }
   //创建一个StringBuiler对象,构建输出对象
   StringBuilder result = new StringBuilder();
   //遍历每个单元格
   for(String cell : cells){
       //查找"<"和">"的位置
       int result1 = cell.indexOf("<");
       int result2 = cell.indexOf(">");
    //如果单元格不包含"<"和">" 则直接将其输出
     if(result1 == -1 && result2 == -1){
        result.append(cell).append(",")
     }
    //如果单元格包含"<"和">",但格式不正确,输出-1并结束
    else if (result1 == -1 || result2 == -1 || result1 > result2 || result2 - result1 != 2){
    //异常
    System.out.println(-1);
      }
    //如果单元格包含正确"<"和">",将其替换为实际的单元格值,并将处理后的单元格添加到结果字符中
    else {
         // 正常情况替换即可               
        result.append(cell, 0, result1)                  
        .append(cells.get(cell.charAt(result1 + 1)))                       
        .append(cell.substring(result2 + 1))                       
        .append(",");
        }
    }
   //注意最后输出删除掉末尾逗号
   Sytem.out.println(result.substring(0,result.length()-1));

  }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值