补充如下方法使其可以运行。 public static int getKeyStringCount(String str,String key){ //统计key在str中出现的次数 int count=0; int index=0; while((______(1)_____){ //查找key串在str串中是否存在 int new = str.indexOf(key); //new记下每轮循环中key串出现的新位置 str=_____(2)____; //从str取得新的剩余子串 count++; } return count ; //返回统计结果 } }
时间: 2024-02-05 13:04:32 浏览: 137
请参考下面的代码实现:
```
public static int getKeyStringCount(String str, String key) {
// 统计key在str中出现的次数
int count = 0;
int index = 0;
while ((index = str.indexOf(key, index)) != -1) { // 查找key串在str串中是否存在
index += key.length(); // 找到key串后,index移到key串之后,以便继续查找下一个key串
str = str.substring(index); // 从str取得新的剩余子串
count++;
}
return count;
}
```
注:此代码中,indexOf方法的第二个参数表示从哪个位置开始查找字符串,若未找到则返回-1。substring方法表示从原字符串中截取子串。
相关问题
现需要设计一个字符串加密程序String getHint(String str, String key),该程序接收两个字符串变量分别为str和key,加密规则如下: 1.当str与key相同位置字符相同时,显示该字符; 2.当str与key相同位置字符不同且str中出现key中包含的字符时,str中该字符加密为+; 3.当str中某个字符不存在上述两种情况的字符加密为*。 函数调用示例: getHint("AAAAA","HARPS"); //+A+++ getHint("HELLO","HARPS"); //H**** getHint("HEART","HARPS"); //H*++* 说明:只需要补全public static String getHint(String str, String key)静态方法即可 输入样例: AAAAA HARPS 输出样例: +A+++ 裁判测试程序样例: import java.util.Scanner; public class Main { public static String getHint(String str, String key) { /* 请在这里填写答案 */ } public static void main(String[] args) { Scanner in=new Scanner(System.in); String str=in.nextLine(); String key=in.nextLine(); System.out.println(getHint(str,key)); } }
请参考以下代码:
```
public static String getHint(String str, String key) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
char c1 = str.charAt(i);
char c2 = key.charAt(i);
if (c1 == c2) {
sb.append(c1);
} else if (str.indexOf(c2) != -1) {
sb.append("+");
} else {
sb.append("*");
}
}
return sb.toString();
}
```
该方法中,我们使用 StringBuilder 来拼接加密后的字符串。对于每个字符,我们先判断是否与 key 中相应位置的字符相同,如果相同则直接添加到 StringBuilder 中。如果不同,我们判断该字符是否在 key 中出现过,如果出现过则添加 +,否则添加 *。最后返回 StringBuilder 转换成的字符串。
代码优化 public String getApplyId() { ValueOperations<String,Long> value = redisTemplate.opsForValue(); LocalDateTime dateTime = LocalDateTime.now(); String date = dateTime.format(DateTimeFormatter.ofPattern("yyMMdd")); Long count = 0L; String append = "Reconciliation:AD" + date; String dateString = "AD" + date; if (value.get(append) == null) { // 获取数据库的值 LambdaQueryWrapper<ReconciliationApply> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(ReconciliationApply::getPurchaseCode, dateString); ReconciliationApply selectOne = applyMapper.selectOne(wrapper); if (selectOne == null) { value.setIfAbsent(append, count); redisTemplate.expire(append, 1, TimeUnit.DAYS); } else { String purchaseCode = selectOne.getPurchaseCode(); String substring = purchaseCode.substring(8, 13); value.setIfAbsent(append, Long.parseLong(substring)); redisTemplate.expire(append, 1, TimeUnit.DAYS); } } Long increment = value.increment(append, 1); String str = String.valueOf(increment); return getSequence(dateString, str); } /** * 格式化 key * * @param str * @return */ public static String getSequence(String dateString, String str) { StringBuilder stringJoiner = new StringBuilder(dateString); int len = str.length(); // 取决于业务规模 4 if (len == DEFAULT_LENGTH) { return stringJoiner.append(str).toString(); } if (str.length() > DEFAULT_LENGTH) { throw new RuntimeException("申请单号已使用完成,请明天再申请"); } int rest = DEFAULT_LENGTH - len; for (int i = 0; i < rest; i++) { stringJoiner.append("0"); } stringJoiner.append(str); return stringJoiner.toString(); }
可以考虑对代码进行如下优化:
1. 将 Redis 的操作放到单独的方法中,方便复用和维护。
2. 对于 Redis 中的值的获取和设置,可以使用 Redis 的 get/set 方法代替 opsForValue() 方法,简化代码。
3. 对于 Redis 中的键的格式,可以使用 String.format() 方法代替 StringBuilder,使代码更加简洁。
4. 对于日期和时间的格式化,可以使用 Java 8 中的 DateTimeFormatter 做进一步优化。
综上所述,代码可以优化为:
```
public String getApplyId() {
LocalDateTime dateTime = LocalDateTime.now();
String dateString = "AD" + dateTime.format(DateTimeFormatter.ofPattern("yyMMdd"));
String key = String.format("Reconciliation:%s", dateString);
ValueOperations<String, String> valueOps = redisTemplate.opsForValue();
String value = valueOps.get(key);
if (value == null) {
ReconciliationApply apply = applyMapper.selectOne(
new LambdaQueryWrapper<ReconciliationApply>().eq(ReconciliationApply::getPurchaseCode, dateString));
if (apply == null) {
valueOps.setIfAbsent(key, "0001");
} else {
String purchaseCode = apply.getPurchaseCode();
String suffix = purchaseCode.substring(8);
valueOps.setIfAbsent(key, suffix);
}
redisTemplate.expire(key, 1, TimeUnit.DAYS);
}
long sequence = valueOps.increment(key, 1);
String str = String.format("%04d", sequence);
return dateString + str;
}
```
阅读全文