借鑒文章:Java-敏感字段加密 - 嗶哩嗶哩
題目描述?
給定一個由多個命令字組成的命令字符串;
1、字符串長度小于等于127字節,只包含大小寫字母,數字,下劃線和偶數個雙引號
2、命令字之間以一個或多個下劃線_進行分割
3、可以通過兩個雙引號""來標識包含下劃線_的命令字或空命令字(僅包含兩個雙引號的命令字),雙引號不會在命令字內部出現
請對指定索引的敏感字段進行加密,替換為******(6個*),
并刪除命令字前后多余的下劃線_。
如果無法找到指定索引的命令字,輸出字符串ERROR
輸入描述
輸入為兩行,
第一行為命令字索引K?(從0開始),
第二行為命?令字符串S。
輸出描述
輸出處理后的命令字符串,如果無法找到指定索引的命令字,?輸出字符串ERROR
用例
輸入 | 1 password?a12345678_timeout_100 |
輸出 | password_******_timeout_100 |
輸入 | 2 aaa_password_"a12_45678"_timeout_100_""_ |
輸出 | aaa_password_******_timeout_100_"" |
說明 | 無 |
java 程序
package com.tarena.test.B10;
import java.util.LinkedList;
import java.util.Scanner;
/**
?*?
?*?
給定一個由多個命令字組成的命令字符串;
1、字符串長度小于等于127字節,只包含大小寫字母,數字,下劃線和偶數個雙引號
2、命令字之間以一個或多個下劃線_進行分割
3、可以通過兩個雙引號""來標識包含下劃線_的命令字或空命令字(僅包含兩個雙引號的命令字),雙引號不會在命令字內部出現
請對指定索引的敏感字段進行加密,替換為******(6個*),
并刪除命令字前后多余的下劃線_。
如果無法找到指定索引的命令字,輸出字符串ERROR 作者:紅葉快樂起來 https://www.bilibili.com/read/cv23309523/ 出處:bilibili
?* @author Administrator
?*
?*/
public class B11Self {
?? ?public static void main(String[] args) {
?? ??? ?try(Scanner sc = new Scanner(System.in)){
?? ??? ??? ?Integer index = Integer.parseInt( sc.nextLine());
?? ??? ??? ?String value = sc.nextLine();
?? ??? ??? ?System.out.println(resultStr(index,value));
?? ??? ?}
?? ?}
?? ?
?? ?public static String resultStr(Integer index,String value) {
?? ??? ?LinkedList<String> list = new LinkedList<>();
?? ??? ?char[] valueArr = value.toCharArray();
?? ??? ?for(int i =0;i<valueArr.length;i++) {
?? ??? ??? ?char ca = valueArr[i];
?? ??? ??? ?String temp = "";
?? ??? ??? ?
?? ??? ??? ?if(ca == '"') {
?? ??? ??? ??? ?int next = value.indexOf('"',i+1);
?? ??? ??? ??? ?//+1因為后面的"也需要截取到
?? ??? ??? ??? ?temp = value.substring(i,next+1);
?? ??? ??? ??? ?i = next + 1;
?? ??? ??? ?}else {
?? ??? ??? ??? ?int next = value.indexOf("_",i);
?? ??? ??? ??? ?if(next != -1) {
?? ??? ??? ??? ??? ?temp = value.substring(i,next);
?? ??? ??? ??? ??? ?i = next;
?? ??? ??? ??? ?}else {
?? ??? ??? ??? ??? ?//沒有_直接截取后面全部的
?? ??? ??? ??? ??? ?temp = value.substring(i);
?? ??? ??? ??? ??? ?//結束循環
?? ??? ??? ??? ??? ?i = value.length();
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?if(!"".equals(temp)) {
?? ??? ??? ??? ?list.add(temp);
?? ??? ??? ?}
?? ??? ?}
?? ??? ?
?? ??? ?if(index<list.size()) {
?? ??? ??? ?list.set(index, "******");
?? ??? ??? ?StringBuilder str = new StringBuilder();
?? ??? ??? ?list.forEach(temp -> str.append(temp).append("_"));
?? ??? ??? ?//將最后的_刪除
?? ??? ??? ?return str.substring(0,str.length()-1);
?? ??? ?}else {
?? ??? ??? ?return "ERROR";
?? ??? ?}
?? ?}
}
?
了解知識點:
1 、try(){} try 方法的()內可以自主關閉任何java流類型參數
2、subString(begin,end) begin與end相同是返回"" (空字符串)
3、subString(0,value.length());? 這樣的截取沒有作用。subString 是包頭不包尾,但是java的索引是從0開始。但是長度是1。如果要丟棄最后一個字符subString(0,value.length()-1) 才可以;