Java 用类替换CSV字符串中的ID

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循环来

我有一个包含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循环来迭代分割的字符串,通过对照列表中的值检查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%熟悉它。流虽然有趣,但并不广为人知,程序员很可能会犯错误或浪费时间寻找它。如果效率是相似的,我总是喜欢清晰的、众所周知的语义,而不是聪明但晦涩的语义。例外情况是,如果您经常使用流,那么可能每个人都很了解它。