Java数组修改求助:调整SSN元素顺序且保留非SSN元素
代码问题分析与修改方案
先帮你梳理下原代码里的核心问题,这些问题直接导致你没得到预期结果:
- SSN验证逻辑完全错位:原数组里的SSN是带横杠的(比如
766-09-9090),长度是11,但你的isValidSSN只认长度9的纯数字字符串,直接把合法SSN当成非SSN跳过了。 - 没抓住核心需求:你的目标是生成一个新的SSN(把
766-09-9090改成766-90-9090),但原代码里的getNextDistinctSsn只是找数组里已有的不同SSN,完全没涉及生成新值的逻辑。 - modifyArray逻辑混乱:一边操作原数组的toArray做swap,一边往newArray里塞值,而且方法没有返回值,调用方根本拿不到最终结果。
下面是修改后的完整代码,以及对应的单元测试:
第一步:修正SSN验证和生成工具方法
先把SSN的格式验证和新SSN生成的逻辑写对:
import java.util.*; public class SsnArrayModifier { // 验证带横杠的标准SSN格式:XXX-XX-XXXX private static boolean isValidSSN(String s) { if (s == null) return false; // 用正则匹配格式,确保是3位-2位-4位的数字组合 return s.matches("\\d{3}-\\d{2}-\\d{4}"); } // 根据需求生成修改后的SSN:把中间两位替换成90 private static String generateModifiedSSN(String originalSsn) { if (!isValidSSN(originalSsn)) { throw new IllegalArgumentException("Invalid SSN format: " + originalSsn); } String[] parts = originalSsn.split("-"); return parts[0] + "-90-" + parts[2]; }
第二步:重写modifyArray方法
这次我们先分离SSN和非SSN元素,单独处理SSN序列,再合并回去,逻辑更清晰:
public static List<String> modifyArray(List<String> arrays) { if (arrays == null) { return Collections.emptyList(); } // 分离SSN和非SSN元素,记录非SSN的位置 List<String> ssnElements = new ArrayList<>(); List<String> nonSsnElements = new ArrayList<>(); List<Integer> nonSsnPositions = new ArrayList<>(); for (int i = 0; i < arrays.size(); i++) { String elem = arrays.get(i); if (isValidSSN(elem)) { ssnElements.add(elem); } else { nonSsnElements.add(elem); nonSsnPositions.add(i); } } // 处理SSN序列:原[A,A,B,B] → [A,B,B,A'](A'是修改后的SSN) List<String> processedSsn = new ArrayList<>(); if (ssnElements.size() >= 4) { processedSsn.add(ssnElements.get(0)); // 保留第一个A processedSsn.add(ssnElements.get(2)); // 第二个换成B processedSsn.add(ssnElements.get(3)); // 保留第三个B processedSsn.add(generateModifiedSSN(ssnElements.get(0))); // 第四个换成修改后的A } else { // 如果SSN数量不足4,直接保留原序列(可根据需求调整) processedSsn.addAll(ssnElements); } // 合并处理后的SSN和非SSN到最终数组 List<String> result = new ArrayList<>(arrays.size()); int ssnIdx = 0; int nonSsnIdx = 0; for (int i = 0; i < arrays.size(); i++) { if (nonSsnIdx < nonSsnPositions.size() && nonSsnPositions.get(nonSsnIdx) == i) { result.add(nonSsnElements.get(nonSsnIdx)); nonSsnIdx++; } else { result.add(processedSsn.get(ssnIdx)); ssnIdx++; } } return result; }
第三步:编写单元测试validateResult
用JUnit风格编写测试,直接验证输入输出是否符合预期:
// 单元测试方法 public static void validateResult() { // 输入数组 List<String> input = List.of( "766-09-9090", "766-09-9090", "877-90-9090", "877-90-9090", "S", "T", "U" ); // 预期结果 List<String> expected = List.of( "766-09-9090", "877-90-9090", "877-90-9090", "766-90-9090", "S", "T", "U" ); // 调用方法获取结果 List<String> actual = modifyArray(input); // 验证结果一致 if (expected.equals(actual)) { System.out.println("测试通过:结果符合预期"); } else { System.err.println("测试失败:结果不符合预期"); System.err.println("预期:" + expected); System.err.println("实际:" + actual); } } public static void main(String[] args) { validateResult(); } }
关键修改点说明
- SSN验证:用正则
\d{3}-\d{2}-\d{4}匹配标准SSN格式,能正确识别原数组中的合法SSN。 - 需求针对性处理:明确把原SSN序列
[A,A,B,B]转换成[A,B,B,A'],其中A'是通过generateModifiedSSN生成的新值,逻辑完全贴合你的目标输出。 - 逻辑清晰化:分离SSN和非SSN元素,单独处理后再合并,避免了原代码中操作原数组导致的混乱。
- 可扩展性:如果后续需要修改SSN的生成规则,只需要调整
generateModifiedSSN方法即可,不用动核心逻辑。
内容的提问来源于stack exchange,提问作者Saroj Adhikari
相关产品推荐
相关产品推荐

