本文介绍如何从文件中逐行读取卡片数据(数值+花色),按顺序构造card对象,并将它们交替分配到两个独立列表中,适用于需要分组处理的场景。
本文介绍如何从文件中逐行读取卡片数据(数值+花色),按顺序构造card对象,并将它们交替分配到两个独立列表中,适用于需要分组处理的场景。
在实际开发中,我们常需解析结构化文本文件并按规则分发数据。例如,给定一个以行组织的卡片文件:首行为总数量,随后每两行为一张卡(数值 + 花色),要求将第1、3、5…张卡放入 listA,第2、4、6…张卡放入 listB——即按卡片序号奇偶性交替存储。
核心思路
- 使用计数器(从0或1开始)记录已处理的卡片序号;
- 每成功构建一个 Card 对象(由连续两行数据组成),根据计数器对2取余结果决定插入目标列表;
- 推荐从 counter = 0 开始,用 counter % 2 == 0 表示偶数序号(第1、3、5…张卡 → 放入 evenList),反之放入 oddList;也可从1开始,逻辑等价。
完整实现示例(Java)
import java.io.*;
import java.util.*;
class Card {
int value;
String suit;
public Card(int value, String suit) {
this.value = value;
this.suit = suit;
}
@Override
public String toString() {
return value + " of " + suit;
}
}
public class CardReader {
public static void main(String[] args) throws IOException {
List<Card> evenList = new ArrayList<>(); // 存储第1、3、5...张卡(索引0、2、4...)
List<Card> oddList = new ArrayList<>(); // 存储第2、4、6...张卡(索引1、3、5...)
try (BufferedReader br = new BufferedReader(new FileReader("cards.txt"))) {
int total = Integer.parseInt(br.readLine().trim()); // 读取总张数(可选校验)
int counter = 0;
while (counter < total && br.ready()) {
// 读取数值行
String valLine = br.readLine();
if (valLine == null) break;
int value = Integer.parseInt(valLine.trim());
// 读取花色行
String suitLine = br.readLine();
if (suitLine == null) break;
Card card = new Card(value, suitLine.trim());
// 交替存入:counter=0→evenList,counter=1→oddList,counter=2→evenList...
if (counter % 2 == 0) {
evenList.add(card);
} else {
oddList.add(card);
}
counter++;
}
}
System.out.println("Even-indexed cards (1st, 3rd, ...): " + evenList);
System.out.println("Odd-indexed cards (2nd, 4th, ...): " + oddList);
}
}注意事项
- 健壮性处理:生产代码中应加入异常捕获(如 NumberFormatException、IOException)、空行跳过及行数不足时的提示;
- 内存效率:若文件极大,可考虑流式处理而非全量加载;
- 扩展性:该模式可轻松推广至 n 个列表轮询(用 counter % n);
- 索引语义:明确“第1张卡对应 counter=0”是常见约定,避免因起始值混淆导致逻辑偏移。
通过这种基于模运算的分发策略,既能保持代码简洁,又能精准实现数据的交替分组,是处理序列化输入的通用范式之一。

















