如果我的目标是找到唯一的对,我应该使用什么数据结构在 Java 中存储一对字符串?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16617662/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
What data structure should I use to store a pair of strings in Java , if my goal is to find unique pairs?
提问by user2394904
I am a beginner in Java. I have some sample data of nodes:
我是 Java 的初学者。我有一些节点的示例数据:
A -> B
B -> F
C -> R
A -> B
B -> C
R -> C
I have already taken out 2 lists: [A,B,C,A,B,R] and [B,F,R,B,C,C]
我已经拿出了 2 个列表:[A,B,C,A,B,R] 和 [B,F,R,B,C,C]
However, how should I go about storing the pairs [AB, BF, CR, AB, BC, RC] so that I can find unique pairs? By unique, I mean AB is not equal to BA .
但是,我应该如何存储对 [AB, BF, CR, AB, BC, RC] 以便我可以找到唯一的对?通过独特,我的意思是 AB 不等于 BA 。
1) So Basically I would like to identify unique pairs.
1)所以基本上我想识别独特的对。
2) I also want to count the number of times each unique pair has appeared.
2)我还想计算每个唯一对出现的次数。
EDITED:
编辑:
3) I am also interested in finding how many different nodes each node connects to.
3)我也有兴趣找到每个节点连接到多少个不同的节点。
4) And how many different nodes connect to each node
4) 每个节点连接了多少个不同的节点
I am struggling to decide whether I really need to write my own class or is there an easier method?
我正在努力决定我是否真的需要编写自己的类还是有更简单的方法?
采纳答案by Kent
Hashtable (datastructure) should work for your requirement. In java, you could consider type HashMap<String,Integer>
哈希表(数据结构)应该适合您的要求。在java中,你可以考虑类型HashMap<String,Integer>
key is the string pair, Integer is count:
键是字符串对,整数是计数:
something like:
就像是:
{
"AB":2,
"CR":1,
"BF":1,
...
}
The complexity of finding unique pairs would be O(n)
找到唯一对的复杂性将是 O(n)
EDIT
编辑
it seems that putting codes here helps to explain the solution:
似乎将代码放在这里有助于解释解决方案:
Map<String, Integer> map = new HashMap<String,Integer>();
//you have two lists with those strings, called list1 and list2.
// list1<String> and list2<String> have same size
String key = null;
for(int i=0;i<list1.size();i++){
key = list1.get(i) + list2.get(i);
if(map.containsKey(key))
map.get(key)++;
else
map.put(key,1);
}
//now the map has been filled, you can go through the map,
//and check the value, if value == 1, then the key is unique.
//for those value >1, you know, which string pair is not unique,
// and how many times it shows.
codes were not written in IDE, so there could be typoes.
代码不是在 IDE 中编写的,所以可能会有错别字。
回答by srikanta
You can create a custom class to store pairs of strings and then use a HashMap
to keep track of the count
您可以创建一个自定义类来存储字符串对,然后使用 aHashMap
来跟踪计数
public class StringPair {
String leftString;
String rightString;
//NOTE: override hashcode and equals methods
}
And then you can use HashMap
for keeping tracking of the count:
然后您可以HashMap
用于跟踪计数:
Map<StringPair, Integer> pairCountMap = new HashMap<StringPair, Integer>();
if(pairCountMap.containsKey(aPairObject)) {
pairCountMap.put(aPairObject, pairCountMap.get(aPairObject)+1);
} else {
pairCountMap.put(aPairObject, 0);
}
回答by harsh
You need a class to designate pair:
您需要一个类来指定对:
public class Pair{
String prv;
String next;
//override hashcode and equals
}
If you use Set
and fill it in with all pair, you'll end-up having unique pairs:
如果您使用Set
并填充所有对,您最终将拥有独特的对:
Set<Pair> pairs = new HashSet<Pair>();
..
pairs.add(new Pair(prv, next));
int uniquePairs = pairs.size();
If you use TreeSet
and make Pair
implement
Comparable
, you'll have a sorted list of pairs
如果您使用TreeSet
和 make Pair
implement
Comparable
,您将拥有一个排序的对列表
Set<Pair> pairs = new TreeSet<Pair>();
..
System.out.println(pairs);
Further, you can use a combination of List
and Set
and apply some logic to figure out exact number of duplicates etc, can also explore removeAll
and retainAll
for implementing logic.
此外,你可以使用的组合List
和Set
和应用一些逻辑弄清楚的副本等确切的数字,也可以探索removeAll
和retainAll
实施的逻辑。
Also, Map
doesn't seem to be a fit in your use case since a class can wrap required mapping and list or set will help to apply desired logic over multiple pairs.
此外,Map
似乎不适合您的用例,因为类可以包装所需的映射,列表或集合将有助于在多个对上应用所需的逻辑。
To get counts of total number of original pairs:
要获得原始对总数的计数:
Set<Pair> pairs = new HashSet<Pair>();
int count =0;
while(..) { //iterating over list of pairs
pairs.add(new Pair(prv, next));
count ++;
}
int uniquePairs = pairs.size();
int totalPairs = count;