CCF-模板生成系统-Java

本文介绍了一个使用Java实现的模板引擎,通过读取用户输入的模板和变量,将变量值替换到模板中的占位符,实现了动态生成文本的功能。文章详细展示了如何使用Scanner类读取输入,如何利用ArrayList和LinkedHashMap存储数据,以及如何遍历和处理这些数据。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Templet {
	static Scanner sc;
	static int m,n;//模板的行数  模板生成是给定的变量的个数
	static Map<String,String> map;
	static List<String> list;
	static int index1,index2,index3;
	static String str1,str2,str3,strsrc,strdest,sub;
	public static void main(String[] args) {
		new Templet().run();
	}
    
	public static void run() {
		sc = new Scanner(System.in);
		list = new ArrayList<>();
		map = new LinkedHashMap<>();
		m = sc.nextInt();
		n = sc.nextInt();
		sc.nextLine();
		//对输入的数据进行存储  模板用list存储
		for(int i=0;i<m;i++) {
			list.add(sc.nextLine());
		}
		
		//给定的变量以键值对的形式用map存储
		for(int i=0;i<n;i++) {
			String temp = sc.nextLine();
			int index1 = temp.indexOf(" ");
			String str1 = temp.substring(0,index1);
			String str2 = temp.substring(index1+2, temp.length()-1);			
			map.put(str1, str2);
		}
		
		deal(list,map);
		Iterator<String> iterator = list.iterator();
		while(iterator.hasNext()) {
			System.out.println(iterator.next());
		}
	}
	
	public static void deal(List<String> lsit,Map<String,String> map) {
		for (int i=0;i<list.size();i++) {
			boolean flag = true;
			while(flag) {
				if(list.get(i).contains("{{")){
		
					index1 = list.get(i).indexOf('{');					
					index2 = list.get(i).indexOf('}');			
					sub = list.get(i).substring(index1+3, index2-1);	//取出标记
					if(map.containsKey(sub)) {   //判断给定标记中是否包含模板中的标记
						//首先对第一个需要替换的标记进行替换
						strsrc = list.get(i).replaceFirst(sub, map.get(sub));	
						//以下操作取出替换后的{{、}}以及空格
						str1 = strsrc.substring(0, index1);
						index3 = strsrc.indexOf('}');
						str2 = strsrc.substring(index1+3,index3-1);						
						str3 = strsrc.substring(index3+2);
						
						//最终第一个标记替换成功
						strdest = str1+str2+str3;
						list.remove(i);
						list.add(i, strdest);
					} else {
						//如果不包含 那么不需要替换  只要取出{{、}}以及空格
						str1 = list.get(i).substring(0, index1);				
						str3 = list.get(i).substring(index2+2);						
						strdest = str1+str3;
						list.remove(i);
						list.add(i,strdest);
					}
				} else {
					
					/*
					 * 该行没有标记 退出while循环 判断下一行  
					 */
					
					break;
				}
			}
			
		}
	}
}

 

### CCF CSP 考试 Java 历年真题及答案解析 以下是关于 CCF CSP 认证考试中涉及的 Java 编程部分的相关内容,包括历年真题及其解答方法。 #### 一、前缀最大值的应用 在某些题目中,可能需要计算某个数组对应的 **前缀最大值**。例如,在某道题目中提到:“给定一个长度为 n 的整数数组 a 和另一个未知数组 b,已知两者之间存在某种关系。” 这里的核心思路在于理解如何通过 m 的值以及 a 数组的值推导出 b 数组的具体数值[^2]。 具体实现可以通过如下方式完成: ```java public class PrefixMax { public static void main(String[] args) { int[] a = {3, 1, 4, 1, 5}; // 示例输入数组 int n = a.length; int[] prefixMax = new int[n]; // 初始化第一个元素 prefixMax[0] = a[0]; // 遍历并更新前缀最大值 for (int i = 1; i < n; ++i) { prefixMax[i] = Math.max(prefixMax[i - 1], a[i]); } System.out.println("Prefix Max Array:"); for (int value : prefixMax) { System.out.print(value + " "); } } } ``` 上述代码展示了如何构建一个简单的前缀最大值数组 `prefixMax`,这是解决类似问题的基础工具之一。 --- #### 二、递推公式的应用 另一类常见问题是基于递推公式求解目标数组。例如,“如果知道两个数组之间的递推关系,则可以逐步推出所需的结果”。这种情况下通常会给出初始条件和后续项的关系表达式。下面是一个典型的例子: 假设我们有一个递推公式 \( b_0 \),\( b_i = f(a_{i-1}, b_{i-1})\) ,则可通过以下方式进行处理: ```java import java.util.Scanner; public class RecurrenceRelation { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); // 输入数组大小 int[] a = new int[n]; // 定义数组a for (int i = 0; i < n; ++i) { a[i] = scanner.nextInt(); } long m = scanner.nextLong(); // 给定参数m long b0 = computeB0(m); // 初始值b0由特定函数决定 long[] b = new long[n]; b[0] = b0; // 使用递推公式填充整个b数组 for (int i = 1; i < n; ++i) { b[i] = ((long)a[i - 1]) * b[i - 1] % m; } System.out.println("Array B:"); for (long val : b) { System.out.print(val + " "); } } private static long computeB0(long m) { return (m + 1) / 2; // 示例初始化逻辑 } } ``` 此代码片段实现了从已知条件出发,按照指定规则生成新的序列 `b`。 --- #### 三、边界条件的重要性 无论是在实际开发还是竞赛环境中,都应特别注意各种极端情况下的表现。正如资料所言,“希望获得满分,仅依赖于官方提供的样本测试显然是不足的;还需要自行设计额外案例,并充分考虑到特殊情形下的行为特征”[^1]。因此建议开发者们多尝试不同类型的输入组合,比如全零数组、负数集合或者极大范围内的随机分布等等。 --- #### 四、总结与技巧分享 为了更好地应对这类挑战赛题型变化莫测的特点,可以从以下几个方面提升自己的能力水平: - 掌握常用数据结构(链表、栈队列等),熟悉它们各自的优缺点; - 学习高级库功能(如 STL 中容器操作模板),提高编写效率的同时减少错误率; - 不断积累经验教训,形成个人专属的知识体系框架。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值