如何在一个有序列表中插入一个新元素并移动Java中的所有其他对象?

匈奴人

假设我有一个简单的类:

public class User implements Comparable<User> {

  private String name;
  private Integer order;

  public User(String name, Integer order) {
    this.name = name;
    this.order = order;
  }

  //...Getters and Setters ommited
  
  @Override
  public int compareTo(User user) {
    return this.order.compareTo(user.getOrder());
  }
}

只有两个属性,用户名和订单。此属性order将用于了解用户在列表中的位置。然后,我将创建一个无序LinkedList()的:

private static List<User> unorderedList() {
    final List<User> users = new LinkedList<>();
    
    users.add(new User("Joe", 5));
    users.add(new User("John", 2));
    users.add(new User("Maria", 8));
    users.add(new User("Kevin", 7));
    users.add(new User("Sophia", 9));
    users.add(new User("James", 1));
    users.add(new User("Adrian", 3));
    
    return users;
}

现在,我需要创建一个新User列表并将其插入到列表中。

User u = new User("David", 2);

但是,在调用该add()方法之前,我必须做一些事情。

我必须订购此列表(这就是我Comparable在User类上实现的原因)并且必须将属性更新order为顺序的。因此,当我在列表中插入新用户时,我需要这样的最终结果:

1 - James    // No Change
2 - David    // New user inserted
3 - John     // Was order 2, become 3
4 - Adrian   // Was order 3, become 4
5 - Joe      // No Change
6 - Kevin    // There was no 6. Kevin was 7 so he become 6
7 - Maria    // Was 8
8 - Sophia - // Was 9

编辑1:我尝试了什么

我试图循环列表,并将列表中的用户顺序与新用户顺序进行比较。newUser在列表内的位置具有优先级。

final List<User> unorderedUsers = MainApp.unorderedList();
final AtomicInteger currentOrder = new AtomicInteger(1);
final User newUser = new User("David", 2);
Collections.sort(unorderedUsers);

unorderedUsers.forEach(user -> {
    if (user.getOrder().equals(newUser.getOrder())) {
        user.setOrder(user.getOrder() + 1);
    } else {
        user.setOrder(currentOrder.get());
    }

    currentOrder.incrementAndGet();
});

unorderedUsers.add(newUser);
Collections.sort(unorderedUsers);
System.out.println(String.format("Ordered with new User List -> %s", unorderedUsers));

但是,新的用户订单将重复。我仍在尝试解决如何执行新的顺序订单。我的代码的结果是:

'James', order=1
'David', order=2
'John', order=3
'Adrian', order=3
'Joe', order=4
'Kevin', order=5
'Maria', order=6
'Sophia', order=7

编辑2-可能找到的解决方案我不知道此解决方案是否涵盖所有情况,但我分两个步骤进行。我知道这有点贵,但这是我得到的。

private void insertNewUser(final List <User> usersList, final User newUser) {
  final AtomicBoolean canShift = new AtomicBoolean(false);
  usersList.forEach(user ->{
    if (user.getOrder().equals(newUser.getOrder()) || canShift.get()) {
      user.shiftOrder();
      canShift.set(true);
    }
  });

  usersList.add(newUser);
  Collections.sort(usersList);
}

private void organizeOrder(final List <User> usersList) {
  final AtomicInteger currentOrder = new AtomicInteger(1);
  usersList.forEach(user -> user.setOrder(currentOrder.getAndIncrement()));
}

然后只需致电:

this.insertNewUser(...)
this.organizeOrder(...)
MC皇帝

您不必实现该Comparable接口。您可以使用进行排序Comparator

users.addFirst(newUser);
// We're using addFirst here, because we want to make sure
// that the new user comes BEFORE possible users with the
// same order

AtomicInteger inc = new AtomicInteger();
users.stream()
    .sorted(Comparator.comparing(User::getOrder))
    .map(user -> {
        user.setOrder(inc.incrementAndGet());
        return user;
    })
    .collect(Collectors.toList();

在上面的代码中,发生的事情是这样的:首先,AtomicInteger创建了一个,这有助于我们为用户提供新的订单号。然后,我们按的序列号对流进行排序User然后,我们从中获得一个新的序列号AtomicInteger,并order使用该数字设置属性。最后,我们将其收集到一个列表中。


addFirst()确保将新用户添加到列表的开头。这是因为在最终排序的列表中,我们希望新用户出现具有相同顺序的任何其他用户之前由于排序是稳定排序,因此具有相同序号的元素将以与未排序流相同的顺序出现。

作为替代方案addFirst(),您可以使用代替

newUser.setOrder(newUser.getOrder() - 1);
users.add(newUser);

代替。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

数组中的最后一个对象替换所有其他对象

如何找到该列表包含另一个列表中的所有元素?

如何检查一个列表中的所有元素是否是Prolog中另一个列表的成员

如何在python列表中从最后到第一个访问所有列表元素

如何确定一组有序列中的第一个零?

选择一个后,如何取消选择数组中的所有其他按钮?

Python如何洗牌一个有序列表,使元素序列?

如何在列表中搜索所有存储在一个大列表中的匹配项

如何在HTML中有一个动态的有序列表?

如何将所有子列表元素组合到一个列表中

ColdFusion:如何在一个插入中插入带有静态外键的列表?

在2个有序列表中查找最大的元素,这不在一个列表中

Spring Data:在对象的有序列表中获取第一个对象的更好方法?

比较列表中的元素并创建一个新元素

在git中,如何在一个分支中提交一个文件,而在所有其他分支中忽略呢?

如何找到只有一个属性并且与网页中的其他元素重复的元素?

如何使用一个列表中的其他元素?

在sql中插入一个新行后,如何自动更新表中的所有其他行?

如何在 ReactJS 组件对象数组中插入一个元素(在现有元素之间)

如何显示元素内元素的所有对象,直到 Angular 中的最后一个元素?

如何在 ReactJs 中将一个对象添加到其他所有对象

如何检查列表中的所有元素是否都在另一个列表中?

Python - 在有序列表中的两个元素之间创建一个新的子列表

如何在python列表中的每个其他元素之后插入一个元素

如何在发布中创建一个通用的 sql 文件来执行所有其他相关的 sql 文件

如何在codeigniter的列表中插入一个对象

如何根据R中的一个有序列表绘制有向箭头?

如果列表中只有一个元素,则隐藏有序列表中的数字

如何在具有查找值的有序字典中查找前一个元素