Tag: 集合

列表是否有一个简短的包含函数?

我看到人们正在使用any来收集另一个列表,看看列表中是否存在一个项目,但有没有一个快速的方法来做? if list.contains(myItem): # do something

在Scala中迭代Java集合

我在写一些使用Apache POI API的Scala代码。 我想迭代包含在我从Sheet类中得到的java.util.Iterator的行。 我想在for each样式循环中使用迭代器,所以我一直在尝试将其转换为本地Scala集合,但不会运气。 我看了Scala包装类/特征,但我看不到如何正确使用它们。 如何在不使用详细while(hasNext()) getNext()循环风格的情况下遍历Scala中的Java集合? 以下是我根据正确答案编写的代码: class IteratorWrapper[A](iter:java.util.Iterator[A]) { def foreach(f: A => Unit): Unit = { while(iter.hasNext){ f(iter.next) } } } object SpreadsheetParser extends Application { implicit def iteratorToWrapper[T](iter:java.util.Iterator[T]):IteratorWrapper[T] = new IteratorWrapper[T](iter) override def main(args:Array[String]):Unit = { val ios = new FileInputStream("assets/data.xls") val workbook = new HSSFWorkbook(ios) var sheet = […]

Java集合副本列表 – 我不明白

我有一个ArrayList ,我想完全复制它。 我假设某人花了一些时间来正确使用实用类, 所以很自然地,我最终得到了包含复制方法的Collections类。 假设我有以下几点: List<String> a = new ArrayList<String>(); a.add("a"); a.add("b"); a.add("c"); List<String> b = new ArrayList<String>(a.size()); Collections.copy(b,a); 这个失败,因为它基本上认为b不够大,不能持有。 是的,我知道b大小是0,但是现在应该足够大了,不是吗? 如果我必须先填充b ,那么Collections.copy()在我脑海中变成一个完全无用的函数。 所以,除了编程一个复制function(我现在要做的)是否有一个适当的方法来做到这一点?

Java有序地图

在Java中,有没有一个像Map一样存储和访问键/值对的对象,但是可以返回一个有序的键列表和一个有序的值列表,这样键和值列表的顺序是相同的? 所以作为解释的代码,我正在寻找一些像我虚构的OrderedMap: OrderedMap<Integer, String> om = new OrderedMap<>(); om.put(0, "Zero"); om.put(7, "Seven"); String o = om.get(7); // o is "Seven" List<Integer> keys = om.getKeys(); List<String> values = om.getValues(); for(int i = 0; i < keys.size(); i++) { Integer key = keys.get(i); String value = values.get(i); Assert(om.get(key) == value); }

ArrayList与LinkedList

我在以前的post上说这个: 对于LinkedList 得到是O(n) 加上是O(1) 删除是O(n) Iterator.remove是O(1) 对于ArrayList 得到是O(1) add是O(1)分期付款,但O(n)最坏的情况,因为数组必须resize和复制 删除是O(n) 所以通过看这个,我得出的结论是,如果我只需要对我的集合中的5000000元素进行顺序插入,则LinkedList将超出ArrayList 。 如果我只是通过迭代来获取集合中的元素,即不在中间抓取元素, LinkedList仍然会超出ArrayList。 现在为了validation我的上述两个陈述,我写了下面的示例程序…但是我惊讶于我的上述陈述被certificate是错误的。 在这两种情况下ArrayList Linkedlist 。 花费比LinkedList更less的时间来添加以及从Collection中获取它们。 有什么我做错了,或者有关LinkedList和ArrayList的初始语句不适用于大小为5000000的集合吗? 我提到了大小,因为如果我将元素数量减less到50000, LinkedListperformance更好,并且初始语句成立。 long nano1 = System.nanoTime(); List<Integer> arr = new ArrayList(); for(int i = 0; i < 5000000; ++i) { arr.add(i); } System.out.println( (System.nanoTime() – nano1) ); for(int j : arr) { ; } System.out.println( […]

在Java中从java.util.stream.Stream中检索列表

我正在玩Java 8 lambda来轻松过滤集合。 但是,我没有find一个简洁的方法来检索结果作为一个新的列表在同一语句。 这是我迄今为止最简洁的方法: List<Long> sourceLongList = Arrays.asList(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L); List<Long> targetLongList = new ArrayList<>(); sourceLongList.stream().filter(l -> l > 100).forEach(targetLongList::add); 网上的例子没有回答我的问题,因为他们停止,而不会产生一个新的结果列表。 必须有一个更简洁的方法。 我会期望, Stream类的方法有toList() , toSet() ,… 有没有一种方法,variablestargetLongList可以直接由第三行分配?

如何通过构造来初始化HashSet值?

我需要用初始值创build一个Set 。 Set<String> h = new HashSet<String>(); h.add("a"); h.add("b"); 有没有办法在一行代码中做到这一点?

在java中获得两组对称差异的最佳方法是什么?

我想知道是否有一个快速/干净的方式来获得两套之间的差异? 我有: Set<String> s1 = new HashSet<String>(); s1.add("a"); s1.add("b"); s1.add("c"); Set<String> s2 = new HashSet<String>(); s2.add("b"); 我需要像这样的东西: Set<String> diff = Something.diff(s1, s2); // diff would contain ["a", "c"] 只是为了澄清我需要对称的差异。

在迭代时从java中删除集合中的项目

我希望能够从一组中删除多个元素,而我正在迭代它。 最初我希望迭代器足够聪明,以便下面的天真的解决scheme工作。 Set<SomeClass> set = new HashSet<SomeClass>(); fillSet(set); Iterator<SomeClass> it = set.iterator(); while (it.hasNext()) { set.removeAll(setOfElementsToRemove(it.next())); } 但是这会抛出一个ConcurrentModificationExceptionexception。 请注意,iterator.remove()将无法正常工作,因为我需要一次删除多个内容。 另外假定不能确定哪些元素要“即时”移除,但是可以写入方法setOfElementsToRemove() 。 在我的具体情况下,将需要大量的内存和处理时间来确定迭代时要删除的内容。 由于内存限制,制作副本也是不可能的。 setOfElementsToRemove()将生成一些我想要移除的SomeClass实例集合, fillSet(set)会用条目填充集合。 在search堆栈溢出后,我无法find这个问题的一个很好的解决scheme,但几个小时后休​​息我意识到以下将做的工作。 Set<SomeClass> set = new HashSet<SomeClass>(); Set<SomeClass> outputSet = new HashSet<SomeClass>(); fillSet(set); while (!set.isEmpty()) { Iterator<SomeClass> it = set.iterator(); SomeClass instance = it.next(); outputSet.add(instance); set.removeAll(setOfElementsToRemoveIncludingThePassedValue(instance)); } setOfElementsToRemoveIncludingThePassedValue()将生成一组要删除的元素,包括传递给它的值。 我们需要删除传递的值,所以set空。 我的问题是,是否有人有更好的方式来做这件事,或者是否有收集操作来支持这种清除。 此外,我想我会张贴我的解决scheme,因为似乎有需要,我想贡献堆栈溢出的优秀资源。

Map的keySet()和entrySet()的性能注意事项

所有, 任何人都可以让我知道究竟是2之间的性能问题? 该站点: CodeRanch提供了使用keySet()和get()时需要的内部调用的简要概述。 但是,如果任何人都可以在使用keySet()和get()方法时提供关于stream程的确切细节,那将是非常好的。 这将帮助我更好地了解性能问题。