如果我的目标是找到唯一的对,我应该使用什么数据结构来存储Java中的一对字符串?

What data structure should I use to store a pair of strings in Java , if my goal is to find unique pairs?

我是Java的初学者。 我有一些节点的示例数据:

1
2
3
4
5
6
7
8
9
10
11
A -> B

B -> F

C -> R

A -> B

B -> C

R -> C

我已经拿出2个清单:[A,B,C,A,B,R]和[B,F,R,B,C,C]

但是,我应该如何存储对[AB,BF,CR,AB,BC,RC],以便找到唯一的对? 通过唯一,我的意思是AB不等于BA。

1)所以基本上我想识别唯一的对。

2)我还想计算每个唯一对出现的次数。

编辑:

3)我也有兴趣找到每个节点连接的节点数。

4)有多少个不同的节点连接到每个节点

我正在努力决定是否真的需要编写自己的类或者是否有更简单的方法?


您可以创建一个自定义类来存储字符串对,然后使用HashMap来跟踪计数

1
2
3
4
5
6
public class StringPair {
   String leftString;
   String rightString;

   //NOTE: override hashcode and equals methods
}

然后你可以使用HashMap来跟踪计数:

1
2
3
4
5
6
7
Map<StringPair, Integer> pairCountMap = new HashMap<StringPair, Integer>();

if(pairCountMap.containsKey(aPairObject)) {
   pairCountMap.put(aPairObject, pairCountMap.get(aPairObject)+1);
} else {
   pairCountMap.put(aPairObject, 0);
}

你需要一个类来指定对:

1
2
3
4
5
public class Pair{
 String prv;
 String next;
 //override hashcode and equals
}

如果你使用Set并用所有对填充它,你最终会得到唯一的对:

1
2
3
4
Set<Pair> pairs = new HashSet<Pair>();
..
pairs.add(new Pair(prv, next));
int uniquePairs = pairs.size();

如果你使用TreeSet并使Pair implement Comparable,你将有一个排序的对列表

1
2
3
Set<Pair> pairs = new TreeSet<Pair>();
..
System.out.println(pairs);

此外,您可以使用ListSet的组合并应用一些逻辑来确定重复的确切数量等,还可以探索removeAllretainAll来实现逻辑。

此外,Map似乎不适合您的用例,因为类可以包装所需的映射,列表或集合将有助于在多对上应用所需的逻辑。

要获得原始对总数的计数:

1
2
3
4
5
6
7
8
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;


Hashtable(数据结构)应该适合您的要求。在java中,您可以考虑输入HashMap

key是字符串对,Integer是count:

就像是:

1
2
3
4
5
6
7
{
"AB":2,
"CR":1,
"BF":1,
...

}

找到唯一对的复杂性将是O(n)

编辑

似乎在这里放置代码有助于解释解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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.

代码不是用IDE编写的,所以可能会有拼写错误。