首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java是否与Python的list.sorted()方法等价于ArrayLists?

Java是否与Python的list.sorted()方法等价于ArrayLists?
EN

Stack Overflow用户
提问于 2021-07-06 15:35:03
回答 2查看 233关注 0票数 2

我知道我可以在Java中的Collections.sort()上调用ArrayList,但是我目前正在尝试重载一个构造函数,而在第二个构造函数中,我想调用第一个构造函数。但是,我想传递一个排序列表作为参数之一,但是Java不允许我在对列表进行排序之后调用this() --它需要this()作为第一行。我只需将Collections.sort(myList)放入构造函数中,但不知道此方法是否返回排序列表,但理想情况下,我希望返回排序列表而不更改原始列表。

这是我的代码(在一所学校或大学里你会发现),包括错误:

代码语言:javascript
运行
复制
public class Period {

    private String name;
    private LocalDateTime start;
    // duration in seconds
    private int duration;
    private Lecturer lecturer;
    private ArrayList<Demonstrator> dems;
    private ArrayList<Skill> skills;
    
    public Period(String name, LocalDateTime start, int duration, Lecturer lecturer) {
        this.name = name;
        this.start = start;
        this.duration = duration;
        this.lecturer = lecturer;
        this.dems = new ArrayList<>();
        this.skills = new ArrayList<>();
    }
    
    public Period(String name, ArrayList<AvailBlock> blocks, Lecturer lecturer) {
        // this line is illegal, but shows you what I'm trying to do.
        Collections.sort(blocks);
        this(name, blocks.get(0).getStart(), ( blocks.size() * AvailBlock.LENGTH ), lecturer);
    }
    ...
}

AvailBlock类作为LocalDateTime对象具有启动时间,并且具有固定的持续时间(当前为15分钟)。我正在尝试创建一个以秒为单位的句点,或者只是传递一个AvailBlock对象的列表,让它知道句点什么时候开始,应该是多长时间。

下面是AvailBlock类的开头:

代码语言:javascript
运行
复制
public class AvailBlock implements Comparable {
    
    // the start time of the slot
    private LocalDateTime start;
    // Length of slots in seconds
    public static final int LENGTH = 900;
    
    public AvailBlock(LocalDateTime start) {
        this.start = start;
    }
    ...
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-06 17:20:11

制作静态工厂方法

作为梅奥洛评论,我将在静态方法而不是构造函数中完成这项工作。最好保持构造函数完全简单。

此外,构造函数的第一行必须是对超级构造函数的隐式或显式调用。因此,在调用Collections.sort之前,我们不能有代码(如对this( … )的调用)。这一定是你在说"//这一行是非法的,但告诉你我想做什么“时提到的问题。第一行作为超级构造函数调用的Java语言需求是使用静态工厂方法解决问题的另一个原因。

我会将方法from命名为命名约定

代码语言:javascript
运行
复制
public static Period from ( … )
{
    …
    return new Period( … ) ;
}

用法:

代码语言:javascript
运行
复制
Period p = Period.from( … ) ;

制作输入列表的副本

你说过:

我只需将Collections.sort(myList)放入构造函数中,但不知道此方法是否返回排序列表,但理想情况下,我希望返回排序列表而不更改原始列表。

在排序之前,先复制一下列表。那你就避免了原始的变异。

要创建一个浅拷贝,您可以将任何Collection Collection传递给 ArrayList.的构造函数。

另外,请注意,由于我们复制然后排序,您的工厂方法可以接受任何类型的List,而不仅仅是ArrayList。事实上,任何一种Collection都可以被接受。

代码语言:javascript
运行
复制
public static Period from ( String name, Collection< AvailBlock > blocks, Lecturer lecturer )
{
    ArrayList< AvailBlock > blocksSorted = new ArrayList<>( blocks ) ;
    Collections.sort( blocksSorted );
    return new Period( name, blocksSorted.get(0).getStart(), ( blocks.size() * AvailBlock.LENGTH ), lecturer ) ;
}

List.copyOf

如果您想要一个不可修改的副本,请将列表传递给List.copyOf

record

顺便说一句,您可能会发现添加到记录中的Java 16特性很方便。

记录是编写类的一种简单方法,其主要目的是透明和不变地通信数据。只需声明每个成员字段的类型和名称即可。编译器隐式地创建构造函数、getter、equals & hashCodetoString

记录可以携带静态工厂方法,正如我们在解决方案中所需要的那样。

票数 1
EN

Stack Overflow用户

发布于 2021-07-06 23:45:13

我会重复其他人关于在构造函数中不做太多事情的评论。但是,如果您想在不改变原始列表的情况下进行内联排序,那么流似乎是最自然的方式。您可以很容易地进行排序,而无需更改原始列表:

代码语言:javascript
运行
复制
blocks.stream().sorted().collect(Collectors.toList())

(...which将返回排序列表,可以内联使用,也可以将其赋值给变量。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68273464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档