我有一个ArrayList
Java的Collection类,如下所示:
ArrayList<String> animals = new ArrayList<String>();
animals.add("bat");
animals.add("owl");
animals.add("bat");
animals.add("bat");
Run Code Online (Sandbox Code Playgroud)
如您所见,它animals
ArrayList
由3个bat
元素和一个owl
元素组成.我想知道Collection框架中是否有任何API返回bat
出现次数或是否有另一种方法来确定出现次数.
我发现Google的Collection Multiset
确实有一个API,可以返回元素的总出现次数.但这只与JDK 1.5兼容.我们的产品目前是JDK 1.6,所以我不能使用它.
我很快就会教"Java崩溃课程".虽然假设观众成员会知道Big-O表示法可能是安全的,但假设他们知道各种集合实现的各种操作的顺序是什么可能是不安全的.
我可以花时间自己生成一个摘要矩阵,但如果它已经在公共领域的某个地方出现,我肯定想重复使用它(当然还有适当的信用.)
任何人有任何指针?
从集合框架概述:
不支持修改操作(例如
add
,remove
和clear
)的集合称为不可修改.不可修改的集合是可修改的.另外保证
Collection
对象中没有可见变化的集合称为不可变.不可变的集合是可变的.
我无法理解这种区别.这里不可修改和不可变
的区别是什么?
如何循环列表并抓取每个项目?
我希望输出看起来像这样:
Console.WriteLine("amount is {0}, and type is {1}", myMoney.amount, myMoney.type);
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
static void Main(string[] args)
{
List<Money> myMoney = new List<Money>
{
new Money{amount = 10, type = "US"},
new Money{amount = 20, type = "US"}
};
}
class Money
{
public int amount { get; set; }
public string type { get; set; }
}
Run Code Online (Sandbox Code Playgroud) 是否有一些单行桥接方法将给定的枚举转储到java.util.List或java.util.Set?
某些内置类似Arrays.asList()
或Collection.toArray()
应该存在的东西,但我无法在IntelliJ调试器的评估窗口中找到它(以及Google/SO结果).
我想比较两个集合(在C#中),但我不确定有效实现它的最佳方法.
我已经阅读了关于Enumerable.SequenceEqual的其他帖子,但这并不是我正在寻找的.
在我的情况下,如果它们都包含相同的项目(无论顺序),则两个集合将是相等的.
例:
collection1 = {1, 2, 3, 4};
collection2 = {2, 4, 1, 3};
collection1 == collection2; // true
Run Code Online (Sandbox Code Playgroud)
我通常做的是遍历一个集合中的每个项目,看看它是否存在于另一个集合中,然后循环遍历另一个集合的每个项目,看它是否存在于第一个集合中.(我首先比较长度).
if (collection1.Count != collection2.Count)
return false; // the collections are not equal
foreach (Item item in collection1)
{
if (!collection2.Contains(item))
return false; // the collections are not equal
}
foreach (Item item in collection2)
{
if (!collection1.Contains(item))
return false; // the collections are not equal
}
return true; // the collections are equal
Run Code Online (Sandbox Code Playgroud)
但是,这并不完全正确,并且它可能不是比较两个集合的最有效方法.
我能想到的一个例子是错误的:
collection1 …
Run Code Online (Sandbox Code Playgroud) 代码如下所示:
namespace Test
{
public interface IMyClass
{
List<IMyClass> GetList();
}
public class MyClass : IMyClass
{
public List<IMyClass> GetList()
{
return new List<IMyClass>();
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行代码分析时,我得到以下建议.
警告3 CA1002:Microsoft.Design:更改'IMyClass.GetList()'中的'List'以使用Collection,ReadOnlyCollection或KeyedCollection
我应该如何解决这个问题以及这里有什么好的做法?
假设我有一个方法将只读视图返回到成员列表:
class Team {
private List < Player > players = new ArrayList < > ();
// ...
public List < Player > getPlayers() {
return Collections.unmodifiableList(players);
}
}
Run Code Online (Sandbox Code Playgroud)
进一步假设所有客户端都立即迭代一次列表.也许将玩家放入JList或其他东西.客户端就不能存储到列表的引用以便稍后进行检查!
鉴于这种常见情况,我应该返回一个流吗?
public Stream < Player > getPlayers() {
return players.stream();
}
Run Code Online (Sandbox Code Playgroud)
或者在Java中返回非惯用的流?设计的流是否始终在它们创建的同一表达式中"终止"?
它看起来似乎arraylist
没有做好预备工作:
// presizing
ArrayList<Integer>() list = new ArrayList<Integer>(60);
Run Code Online (Sandbox Code Playgroud)
之后当我尝试访问它时:
list.get(5)
Run Code Online (Sandbox Code Playgroud)
它显示null而不是0.有没有办法将所有元素初始化为精确大小的0,就像C++一样?
我是Java的新手,非常困惑.
我有一个长度为4的大型数据集,int[]
我想计算4个整数的每个特定组合出现的次数.这与计算文档中的单词频率非常相似.
我想创建一个Map<int[], double>
将每个int []映射到一个运行计数的列表迭代,但Map不采用原始类型.
所以我做了 Map<Integer[], Double>
我的数据存储为一个ArrayList<int[]>
所以我的循环应该是这样的
ArrayList<int[]> data = ... // load a dataset`
Map<Integer[], Double> frequencies = new HashMap<Integer[], Double>();
for(int[] q : data) {
// **DO SOMETHING TO convert q from int[] to Integer[] so I can put it in the map
if(frequencies.containsKey(q)) {
frequencies.put(q, tfs.get(q) + p);
} else {
frequencies.put(q, p);
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定在评论中需要哪些代码才能使这项工作转换int[]
为Integer[]
.或者我可能从根本上对正确的方法感到困惑.
collections ×10
java ×7
.net ×2
c# ×2
api ×1
arraylist ×1
arrays ×1
big-o ×1
comparison ×1
conventions ×1
equality ×1
for-loop ×1
generics ×1
immutability ×1
java-8 ×1
java-stream ×1