java—如何计算arraylist中元素的总更改时间

plicqrtu  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(233)

场景是我有一个类,如下所示,

@Data
class Operation
{
    private String id;
    private String name;
    private String description;
}

以及包含大量操作示例的arraylist。
例如,arraylist中有5个示例,

{"id":"0001", "name":"up"}
{"id":"0002", "name":"down"}
{"id":"0003", "name":"left"}
{"id":"0004", "name":"left"}
{"id":"0005", "name":"up"}

我想知道arraylist中的名称更改了多少次,在这种情况下,第二个名称是down,它与第一个名称不同,更改次数是1,第三个名称与第二个名称也不同,那么更改次数是2,但是第四个名称与第三个名称相同,所以更改次数仍然是2,第五个与第四个不同,因此此arraylist的更改时间为3。
有没有不遍历arraylist的方法来计算它?

2eafrhcq

2eafrhcq1#

当您对exmaple使用if(setevent(index,object))时,您可以从该事件生成if(object==“meow”)return true;返回false;如果是真的,它会被设定,如果不是。
可以使用抽象类添加事件(侦听器)

public abstract class MyList<Object> {

private ArrayList<Object> list = new ArrayList<>();

public void set(int index,Object object){
    if(setEvent(index,object)) list.set(index,object);
}

public void add(Object object){
    if(addEvent(object)) list.add(object);
}

public void remove(Object object){
    if(removeEvent(object)) list.remove(object);
}

public void remove(int index){
    if(removeEvent(index)) list.remove(index);
}

public Object get(int index){
    if(getEvent(index)) return list.get(index);
    return null;
}

public void clear(){
    if(clearEvent()) list.clear();
}

//Abstract

public abstract boolean setEvent(int index, Object object);

public abstract boolean addEvent(Object object);

public abstract boolean removeEvent(Object object);

public abstract boolean removeEvent(int index);

public abstract boolean getEvent(int index);

public abstract boolean clearEvent();

}
628mspwn

628mspwn2#

List<Operation> operations = List.of(
            new Operation("0001", "up"),
            new Operation("0002", "down"),
            new Operation("0003", "left"),
            new Operation("0004", "left"),
            new Operation("0005", "up"));

    // Don’t include index 0 since it has no previous name to compare with
    long numberOfNameChanges = IntStream.range(1, operations.size())
            .filter(i -> ! operations.get(i - 1).getName()
                    .equals(operations.get(i).getName()))
            .count();

    System.out.println("Count is " + numberOfNameChanges);

输出为:
计数是3
它确实横穿了整个名单。
为了一个完整的例子,我用 List.of() (自Java9以来)而不是 ArrayList ,但流操作与 ArrayList 我也是。
我通常说,当涉及到更多列表元素的操作时,流操作不会很好地工作。这似乎是个例外;我发现溪流的解决方案我自己也很好。如果愿意,可以用循环来编码。
ps我不太喜欢在你没有表现出那么多努力的时候把工作代码泄露出去。只是我发现这更容易用代码解释,所以我妥协了。
编辑
不如我们收集一组值…
不,那不行。我举两个例子给你看。先简单一点,我刚去掉最后一个 up 因此只有两个值更改:

List<Operation> operations = List.of(
            new Operation("0001", "up"),
            new Operation("0002", "down"),
            new Operation("0003", "left"),
            new Operation("0004", "left"));

    Set<String> collect = operations.stream()
            .map(operation -> operation.name.toLowerCase())
            .collect(Collectors.toSet());

    System.out.println(collect);

[左,上,下]
即使删除了一个值更改,集合中仍有3个元素。你可能会想到你可以减去1。不是这样的。请看下一个也是最后一个示例:

List<Operation> operations = List.of(
            new Operation("0001", "up"),
            new Operation("0003", "left"),
            new Operation("0002", "up"),
            new Operation("0003", "left"),
            new Operation("0004", "left"));

现在有三个值更改,但集合中只有两个元素:
[左上]
如果你减去1,你会得到1。
你现在可能已经意识到了 Set 方法是,当相同的名称稍后再次出现并导致新的值更改时,它不考虑。

p1iqtdky

p1iqtdky3#

有没有不遍历arraylist的方法来计算它?
不。
要查看列表中的每个值并与相邻值进行比较,需要遍历列表。没有神奇的捷径。

相关问题