【问题标题】:Finding diff between two lists and adding plus and minus a more efficient way查找两个列表之间的差异并添加加减是一种更有效的方法
【发布时间】:2021-02-11 15:53:43
【问题描述】:

我有两个具有相同数据的列表,但第一个列表的措辞可能略有不同。 我确保字段不匹配。如果他们不这样做,那么我在数组中的第一个单词中添加一个加号,在第二个数组中的第二个单词中添加一个减号。

我只是在迭代列表,我有很多 ifs。我还需要做其他数据点,ifs 可能会变得很长。有没有更有效的方法来做到这一点? 我不擅长 java 8+ 和流。用流来做会更好吗?如果是这样,我该怎么做?可以举个例子吗?

提前谢谢你!!!我真的需要帮助,但我希望我的心碎了!

List<ExteriorColor> f1 = vinResponseOne.getResult().getExteriorColors();
List<ExteriorColor> f2 = vinResponseTwo.getResult().getExteriorColors();

first = vinResponseOne.getResult().getExteriorColors();
second = vinResponseTwo.getResult().getExteriorColors();



private void compareExteriorColors(List<ExteriorColor> f1, List<ExteriorColor> f2){

    for(int i =0; i< f1.size(); i++) {

        if (!f1.get(i).getDescription().equals(f2.get(i).getDescription())) {
            final String added = "+ " + f1.get(i).getDescription();
            final String original = "- " + f2.get(i).getDescription();
            first.get(i).setDescription(added);
            second.get(i).setDescription(original);
        }

         if (!f1.get(i).getGenericDesc().equals(f2.get(i).getGenericDesc())) {
            final String  added = "+ " + f1.get(i).getGenericDesc();
            final String original = "- " + f2.get(i).getGenericDesc();
            first.get(i).setGenericDesc(added);
            second.get(i).setGenericDesc(original);
        }

        if (!f1.get(i).getColorCode().equals(f2.get(i).getColorCode())) {
            final String added = "+ " + f1.get(i).getColorCode();
            final String original = "- " + f2.get(i).getColorCode();
            f1.get(i).setColorCode(added);
            f2.get(i).setColorCode(original);
        }

        if (f1.get(i).getInstallCause() != null) {
            if (!f1.get(i).getInstallCause().equals(f2.get(i).getInstallCause())) {
                final String added = "+ " + f1.get(i).getInstallCause();
                final String original = "- " + f2.get(i).getInstallCause();
                first.get(i).setInstallCause(added);
                second.get(i).setInstallCause(original);
            }
        }

        if (!f1.get(i).getPrimary().equals(f2.get(i).getPrimary())) {
            final String added = "+ " + f1.get(i).getPrimary();
            final String original = "- " + f2.get(i).getPrimary();
            first.get(i).setPrimary(added);
            second.get(i).setPrimary(original);
        }

        if (!f1.get(i).getRgbValue().equals(f2.get(i).getRgbValue())) {
            final String added = "+ " + f1.get(i).getRgbValue();
            final String original = "- " + f2.get(i).getRgbValue();
            first.get(i).setRgbValue(added);
            second.get(i).setRgbValue(original);
        }

        if (!f1.get(i).getStyles().equals(f2.get(i).getStyles())) {
            List<String> styleFirst = new ArrayList<>();
            List<String> styleSecond = new ArrayList<>();
            final String added = "+ " + f1.get(i).getStyles();
            final String original = "- " + f2.get(i).getStyles();
            styleFirst.add(added);
            styleSecond.add(original);
            first.get(i).setStyles(styleFirst);
            second.get(i).setStyles(styleSecond);
        }

        if (!f1.get(i).getType().equals(f2.get(i).getType())) {
            String added = "+ " + f1.get(i).getType();
            String original = "- " + f2.get(i).getType();
            first.get(i).setType(added);
            second.get(i).setType(original);
        }

    }
    
}

它最终的样子。

我稍后会转换成 json。

【问题讨论】:

    标签: java arrays performance java-stream


    【解决方案1】:
    class User { //Considering a simple class with only 2 fields for brevity
      private String userName;
      private String password;
    
      User(String userName, String password) {
        this.userName = userName;
        this.password = password;
      }
    
      public String getUserName() {
        return userName;
      }
    
      public void setUserName(String userName) {
        this.userName = userName;
      }
    
      public String getPassword() {
        return password;
      }
    
      public void setPassword(String password) {
        this.password = password;
      }
    
      @Override
      public String toString() {
        return "User{" + "userName='" + userName + '\'' + ", password='" + password + '\'' + '}';
      }
    }
    
    public class S14 {
      public static void main(String[] args) {
        User user1 = new User("Anees", "pwd");
        User user2 = new User("Anees1", "pwd");
        List<User> userList1 = new ArrayList<>(Arrays.asList(user1, user2));
        User user3 = new User("Anees2", "pwd");
        User user4 = new User("Anees3", "pwd");
        List<User> userList2 = new ArrayList<>(Arrays.asList(user3, user4));
        // Assuming both Lists are of same size
        IntStream.range(0, userList1.size())
            .forEach(
                i -> {
                  User firstListUser = userList1.get(i);
                  User secondListUser = userList2.get(i);
                  //HERE GOES THE MAIN PART
                  compareStringsAndProcessElement(
                      firstListUser::getUserName,
                      secondListUser::getUserName,
                      (s, s2) -> !s.equals(s2),
                      firstListUser::setUserName,
                      secondListUser::setUserName);
    
                  compareStringsAndProcessElement(
                      firstListUser::getPassword,
                      secondListUser::getPassword,
                      (s, s2) -> !s.equals(s2),
                      firstListUser::setPassword,
                      secondListUser::setPassword);
                  //AND SO ON!
                });
        System.out.println(userList1);
        System.out.println(userList2);
      }
    
      private static void compareStringsAndProcessElement(
          Supplier<String> element1,
          Supplier<String> element2,
          BiPredicate<String, String> stringStringBiPredicate,
          Consumer<String> u1,
          Consumer<String> u2) {
        String e1 = element1.get();
        String e2 = element2.get();
        if (stringStringBiPredicate.test(e1, e2)) {
          e1 = "+" + e1;
          e2 = "-" + e2;      
          u1.accept(e1);
          u2.accept(e2);
        } 
      }
    }
    

    希望这会有所帮助!这与 Streams 没有什么不同,而是使用函数式方法而不是您的声明式方法来解决问题。这也可以用 Normal 循环而不是 IntStream 来编写。

    PS:就性能而言,这可能比声明式实现还要慢,因为它涉及多个方法调用。但是,与代码可维护性相比,节省一些纳秒并不是一个好的权衡。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 2014-01-16
      • 2016-07-04
      • 1970-01-01
      • 2014-01-05
      相关资源
      最近更新 更多