我知道我可以在Java中的Collections.sort()
上调用ArrayList
,但是我目前正在尝试重载一个构造函数,而在第二个构造函数中,我想调用第一个构造函数。但是,我想传递一个排序列表作为参数之一,但是Java不允许我在对列表进行排序之后调用this()
--它需要this()
作为第一行。我只需将Collections.sort(myList)
放入构造函数中,但不知道此方法是否返回排序列表,但理想情况下,我希望返回排序列表而不更改原始列表。
这是我的代码(在一所学校或大学里你会发现),包括错误:
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
类的开头:
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;
}
...
}
发布于 2021-07-06 17:20:11
制作静态工厂方法
作为梅奥洛评论,我将在静态方法而不是构造函数中完成这项工作。最好保持构造函数完全简单。
此外,构造函数的第一行必须是对超级构造函数的隐式或显式调用。因此,在调用Collections.sort
之前,我们不能有代码(如对this( … )
的调用)。这一定是你在说"//这一行是非法的,但告诉你我想做什么“时提到的问题。第一行作为超级构造函数调用的Java语言需求是使用静态工厂方法解决问题的另一个原因。
我会将方法from
命名为命名约定。
public static Period from ( … )
{
…
return new Period( … ) ;
}
用法:
Period p = Period.from( … ) ;
制作输入列表的副本
你说过:
我只需将Collections.sort(myList)放入构造函数中,但不知道此方法是否返回排序列表,但理想情况下,我希望返回排序列表而不更改原始列表。
在排序之前,先复制一下列表。那你就避免了原始的变异。
要创建一个浅拷贝,您可以将任何Collection
Collection
传递给 ArrayList
.的构造函数。
另外,请注意,由于我们复制然后排序,您的工厂方法可以接受任何类型的List
,而不仅仅是ArrayList
。事实上,任何一种Collection
都可以被接受。
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
& hashCode
和toString
。
记录可以携带静态工厂方法,正如我们在解决方案中所需要的那样。
发布于 2021-07-06 23:45:13
我会重复其他人关于在构造函数中不做太多事情的评论。但是,如果您想在不改变原始列表的情况下进行内联排序,那么流似乎是最自然的方式。您可以很容易地进行排序,而无需更改原始列表:
blocks.stream().sorted().collect(Collectors.toList())
(...which将返回排序列表,可以内联使用,也可以将其赋值给变量。)
https://stackoverflow.com/questions/68273464
复制相似问题