Questions tagged «collections»

6
Java 8为什么不包含不可变的集合?
Java团队做了很多出色的工作,消除了Java 8中函数编程的障碍。特别是,对java.util集合的更改在将转换链接到非常快速的流式操作方面做得很好。考虑到他们在集合上添加一流的函数和函数方法做得多么出色,为什么他们完全无法提供不可变的集合甚至不可变的集合接口呢? 在不更改任何现有代码的情况下,Java团队可以随时添加与可变接口相同的不可变接口,减去“ set”方法并使现有接口从其扩展,如下所示: ImmutableIterable ____________/ | / | Iterable ImmutableCollection | _______/ / \ \___________ | / / \ \ Collection ImmutableList ImmutableSet ImmutableMap ... \ \ \_________|______________|__________ | \ \___________|____________ | \ | \___________ | \ | \ | List Set Map ... 当然,诸如List.add()和Map.put()之类的操作当前会返回给定键的布尔值或先前值,以指示该操作是成功还是失败。不可变集合必须将此类方法视为工厂,并返回包含添加元素的新集合-该集合与当前签名不兼容。但这可以通过使用其他方法名称(例如ImmutableList.append()或.addAt()和ImmutableMap.putEntry())来解决。由此产生的冗长性将远远超过使用不可变集合的好处所抵消,并且类型系统将防止调用错误方法的错误。随着时间的流逝,旧的方法可能会被弃用。 永恒收藏的胜利: 简单性-当基础数据不变时,关于代码的推理就更简单了。 文档-如果某个方法采用不可变的集合接口,则您将知道它不会修改该集合。如果某个方法返回一个不可变的集合,则说明您无法对其进行修改。 并发-不可变集合可以在线程之间安全地共享。 …

9
没有并发性时,不变性是否值得?
似乎总是/经常提到线程安全是使用不可变类型(尤其是集合)的主要好处。 我有一种情况,我想确保方法不会修改字符串字典(在C#中是不可变的)。我想尽可能地约束事物。 但是,我不确定将依赖项添加到新程序包(Microsoft不可变集合)是否值得。性能也不是大问题。 因此,我想我的问题是,在没有硬性能要求且没有线程安全问题的情况下,是否强烈建议使用不可变集合?考虑一下值语义(在我的示例中)可能是也可能不是要求。

6
用有意义的类名屏蔽Java集合的好坏方法?
最近,我习惯于用人类友好的类名“掩盖” Java集合。一些简单的例子: // Facade class that makes code more readable and understandable. public class WidgetCache extends Map<String, Widget> { } 要么: // If you saw a ArrayList<ArrayList<?>> being passed around in the code, would you // run away screaming, or would you actually understand what it is and what // …

8
为什么java.util.ArrayList允许添加null?
我不知道为什么java.util.ArrayList允许添加null。在任何情况下我都想添加null到ArrayList吗? 我问这个问题是因为在一个项目中,我们有一个错误,其中一些代码正在添加null到,ArrayList并且很难发现该错误在哪里。显然NullPointerException抛出了a ,但是直到其他代码尝试访问该元素时才抛出。问题是如何找到添加null对象的代码。如果ArrayList在要添加元素的代码中引发异常,那会更容易。

9
我应该在遍历它们的方法中接受空集合吗?
我有一个方法,其中所有逻辑都在foreach循环内执行,该循环遍历该方法的参数: public IEnumerable<TransformedNode> TransformNodes(IEnumerable<Node> nodes) { foreach(var node in nodes) { // yadda yadda yadda yield return transformedNode; } } 在这种情况下,发送一个空集合会导致一个空集合,但是我想知道这是否不明智。 我的逻辑是,如果有人正在调用此方法,那么他们打算传入数据,并且只会在错误的情况下将空集合传递给我的方法。 我应该捕获此行为并抛出异常,还是返回空集合的最佳实践?

6
我想编写一个“最终洗牌”算法来对我的mp3集合进行排序
我正在寻找伪代码建议,以避免标题和艺术家重复的方式对mp3文件进行排序。我听低吟的歌手-弗兰克·辛纳屈(Frank Sinatra),托尼·贝内特(Tony Bennett),埃拉·菲茨杰拉德(Ella Fitzgerald)等歌唱旧唱片。每位歌手都录制许多相同的歌曲-《飞向月球》,《今夜的样子》,《星尘》等。我的目标是安排歌曲(或订购播放列表),并在歌手和歌曲名称之间留出最大的空间。因此,如果我有2000首歌曲,而Ella有20首,我想每100首歌曲只听一次她。如果有10位歌手演唱《飞向月球》,我希望每200首歌曲中听到一次。当然,我想结合这两个要求来创建我的“最终洗牌”。 我知道这是一个相当广泛的问题。我尚未开始对其进行编程,因此我只是在寻找采用一种好的方法的建议。关于均匀间隔其他歌曲属性,我实际上还有一些其他要求,但这里不再赘述。 首先,我正在修改在这里找到的代码,以处理mp3文件和读取ID3标签。 我编写了一个小应用程序,使用下面的parsifal回答可以满足我的需求。我还在这里写了一个后续问题。感谢您的所有好评!

2
Java:为什么集合会接受比较器而不接受(假设的)Hasher和Equator?
当您使用接口的不同实现时,此问题最明显,并且出于特定集合的目的,您仅关心对象的接口级视图。例如,假设您有一个像这样的接口: public interface Person { int getId(); } 实现hashcode()和equals()实现类的通常方法在equals方法中将具有如下代码: if (getClass() != other.getClass()) { return false; } 这会导致问题,当你混的实现Person中HashMap。如果HashMap仅关心的接口级视图Person,则最终可能会出现仅在实现类上有所不同的重复项。 您可以通过equals()对所有实现使用相同的Liberty 方法来使这种情况起作用,但是您冒着equals()在不同上下文中做错事的风险(例如,比较Person数据库记录支持的两个带有版本号的)。 我的直觉告诉我,应该对每个集合而不是对每个类定义相等性。当使用依赖于排序的集合时,可以使用自定义Comparator在每个上下文中选择正确的排序。基于散列的集合没有类似物。为什么是这样? 为了澄清起见,此问题与“ 为什么.compalsTo()在接口中而.equals()在Java类中? ”不同,因为它处理集合的实现。compareTo()和equals()/ 和/ hashcode()都存在使用集合时的通用性问题:您不能为不同的集合选择不同的比较函数。因此,出于这个问题的目的,对象的继承层次结构根本无关紧要;重要的是比较函数是按对象定义还是按集合定义。
25 java  collections 

1
为什么.Net中的数组具有Length,而其他集合类型具有Count?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 例如,在C#中,数组具有Length属性。但是其他收集类型(如列表等)具有Count属性。这两个有何不同的原因吗?如果是这样,我想知道。

7
“ Set”是否应具有Get方法?
让我们拥有这个C#类(在Java中几乎相同) public class MyClass { public string A {get; set;} public string B {get; set;} public override bool Equals(object obj) { var item = obj as MyClass; if (item == null || this.A == null || item.A == null) { return false; } return this.A.equals(item.A); } public override int GetHashCode() …

4
是否可以通过PUT或DELETE部分更改集合?
我在一个产品组中有一个产品集合,例如: product-groups/123/products 如果我需要添加到集合中,可以通过PUT 只传递某些产品吗? 如果我需要从集合中删除某些产品,可以通过DELETE 传递过滤器数据(ID数组)吗? 秉承ReST精神实现功能的最佳方法是什么? 编辑:项目是指向单独实体(基本上是产品ID)的链接。
21 rest  collections 

5
随机播放对象的有效方法
我正在为一些测验软件编写程序。我有一个问题类,其中包含用于问题,答案,选项,标记和否定标记的ArrayList。像这样: class question { private ArrayList<Integer> index_list; private ArrayList<String> question_list; private ArrayList<String> answer_list; private ArrayList<String> opt1_list; private ArrayList<String> opt2_list; } 我想打乱所有问题,但要打乱所有问题,则所有对象都需要打乱。我本可以以这种方式解决这个问题: 首先,我将不会使用此设计,也不会使用String而不是ArrayList<String>类型作为实例变量,然后会使用该Collections.shuffle方法来随机播放对象。但是我的团队坚持采用这种设计。 现在,问题类别包含输入问题时不断增加的ArrayLists。现在如何洗牌?
20 java  collections 

3
在通常返回集合的地方返回Streams是理智的事情吗?
在开发与任何旧代码无关的API时,我经常发现自己编写的方法纯粹是通过收集结果终止的Streams管道。像这个: ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() { return myPrivateThingies.stream() .map(this::ownerOfThing) .map(Owner::socialStatus) .filter(SocialStatus::isHeAFineMatey) .collect(MyCustomCollectors.toImmutableSet()); } 现在,此类的大多数客户端通常将需要Collection(在本例中为ImmutableSet)来搜索元素并对其进行迭代,但是某些客户端可能会受益于拥有Stream,因此可以在此基础上传递更多的操作流,而无需从集合中获取新的流。因此,返回Stream会给客户提供他们如果拥有Collection便拥有的选项超集(毕竟,他们总是可以collect()自己拥有Stream: Stream<T> deriveSomethingMeaningfulFromPrivateState() { return myPrivateThingies.stream() .map(this::ownerOfthing) .map(Owner::socialStatus) .filter(SocialStatus::isHeAFineMatey); // No collect } 这种方法对我来说很诱人,因为我看不到它可能存在的任何潜在缺陷。但是,我在任何库中都从未见过这种方法(可能是因为Java 8出现后没有发布太多的库),所以我有点害怕采用它。现有的库类通常在从私有状态派生出某些东西时返回Collections。 如果我决定在Java-8之前的我自己会返回Collection的任何地方返回Stream ,会发生什么不好的事情?还是我可能在这里做一些反模式的事情,而这一切都源于私人国家?

3
如何对返回集合的测试方法进行单元化,同时避免测试中的逻辑
我正在测试一种生成数据对象集合的方法。我想验证是否正确设置了对象的属性。一些属性将被设置为相同的东西;其他的将被设置为一个值,该值取决于它们在集合中的位置。做到这一点的自然方法似乎是循环。但是,Roy Osherove强烈建议不要在单元测试中使用逻辑(Art of Unit Testing,178)。他说: 包含逻辑的测试通常一次只能测试多个对象,因此不建议这样做,因为该测试的可读性和脆弱性更高。但是测试逻辑也会增加复杂性,其中可能包含隐藏的错误。 通常,测试应该是一系列没有控制流的方法调用,甚至没有try-catch,并且带有断言调用。 但是,我看不出我的设计有什么问题(您还如何生成数据对象列表,其中某些值取决于它们在序列中的位置?无法完全分别生成和测试它们)。我的设计中是否存在非测试友好的问题?还是过于刻板地致力于Osherove的教学?还是有一些我不知道的秘密单元测试魔术可以解决这个问题?(我正在用C#/ VS2010 / NUnit编写,但是如果可能的话,寻找与语言无关的答案。)

5
Java堆分配比C ++更快
我已经在SO上发布了这个问题,它的确可以。不幸的是它关闭了(只需要一票就可以重新打开),但是有人建议我将它发布在这里,因为它更合适,因此以下内容实际上是该问题的粘贴内容 我正在阅读对此答案的评论,并且看到了这句话。 对象实例化和面向对象功能使用起来非常快(在许多情况下,它们比C ++更快),因为它们是从一开始就设计的。且收集速度很快。即使在大多数优化的C代码方面,标准Java在这一领域也优于标准C / C ++。 一位用户(我可能会添加非常高的代表)大胆地捍卫了这一主张,并指出 Java中的堆分配比C ++更好 并添加了该语句来捍卫Java中的集合 与Java集合相比,Java集合与C ++集合相比速度更快,这在很大程度上归因于内存子系统的不同。 所以我的问题是,这是否真的是真的,如果是的话,为什么Java的堆分配这么快?


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.