Java 用类替换CSV字符串中的ID
我有一个包含ID列表的CSV字符串Java 用类替换CSV字符串中的ID,java,csv,Java,Csv,我有一个包含ID列表的CSV字符串 1,2,5,8 我还有一个对应的列表,其中包含一个Car类,如下所示。车辆id与我的CSV列表中的id相对应,该列表包含所有已知车辆 @Data @AllArgsConstructor public class Car { private int id; private string model; } 我想要的是一个CSV字符串,它不是ID,而是模型参数 我已经使用StringTokenizer分割了我的CSV字符串,然后创建了一个for循环来
1,2,5,8
我还有一个对应的列表,其中包含一个Car类,如下所示。车辆id与我的CSV列表中的id相对应,该列表包含所有已知车辆
@Data
@AllArgsConstructor
public class Car {
private int id;
private string model;
}
我想要的是一个CSV字符串,它不是ID,而是模型参数
我已经使用StringTokenizer分割了我的CSV字符串,然后创建了一个for循环来迭代分割的字符串,通过对照列表中的值检查ID来构建一个新字符串。该解决方案工作正常,但感觉不够优雅。我认为它可以更好地使用流来编写,但不能这样做
String[] cars = carsCsv.split(",");
String carsNames = "";
for (int i = 0; i < cars.length; i++) {
for (Car car: carList) {
if (StringUtils.equals(cars[i], car.getId().toString())) {
if (i == cars.length-1) {
carsNames += car.getModel();
} else {
carsNames =+ car.getModel() + ", ";
}
}
}
有什么想法吗 使用循环表示算法没有什么错。为了提高效率,我建议做几点小改动:
String[] carsIds = carsCsv.split(",");
StringBuilder carsNames = new StringBuilder();
for (String carId: carsIds) {
int carIdInt = Integer.parseInt(carId);
for (Car car: carList) {
if (carIdInt == car.getId()) {
if (carsNames.length()>0) {
carsNames.append(", ");
}
carsNames.append(car.getModel());
}
}
}
return carsNames.toString();
更有效的方法是将carID转换为整数一次,然后在遍历内部循环时使用整数比较
使用StringBuilder收集字符更有效,因为否则字符串操作会在封面下自动地重复转换字符串
另一个答案是使用map,但您必须意识到map本身正在运行一个循环。将它们全部转换为整数的映射实际上是一个循环,并为结果构造一个数组,然后查找模型的映射正在执行另一个循环。没有什么神奇之处:算法必须循环遍历数据。我个人认为使循环显式没有任何问题
手工制作的循环得益于使用局部变量的优化,而不必在每一步都重建一个数组。这是个人的选择。请编辑问题并添加您当前使用的相关代码。我的代码样本更新了这些代码。我同意这样一个事实,即他将始终必须循环,无论是使用for还是流。然而,流API的一个有趣之处是它减少了样板代码,并强调了行为参数化的概念。因此,您可以用英语单词替换for和if块以及其他语句中的所有噪音。@ArnaudClaudel我发现streams方法在智力上非常有趣。这是一种不需要循环就能完成的技巧。我还了解到,聪明的代码并不总是最容易维护的。每个Java程序员都知道for的语义,您可以100%熟悉它。流虽然有趣,但并不广为人知,程序员很可能会犯错误或浪费时间寻找它。如果效率是相似的,我总是喜欢清晰的、众所周知的语义,而不是聪明但晦涩的语义。例外情况是,如果您经常使用流,那么可能每个人都很了解它。