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

如果我的目标是找到唯一的字符串对,我应该使用什么数据结构来存储Java中的一对字符串?,java,data-structures,Java,Data Structures,我是Java的初学者。我有一些节点的示例数据: 我已经拿出了两份清单:[A,B,C,A,B,R]和[B,F,R,B,C,C] 但是,我应该如何存储这些对[AB、BF、CR、AB、BC、RC],以便找到唯一的对?唯一的意思是AB不等于BA 1) 所以基本上我想确定唯一的对 2) 我还想数一数每一对出现的次数 编辑: 3)我还想知道每个节点连接到多少个不同的节点。 4)以及有多少不同的节点连接到每个节点 我正在努力决定是否真的需要编写自己的类,还是有更简单的方法?您可以创建一个自定义类来存储字符串对

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

我已经拿出了两份清单:[A,B,C,A,B,R]和[B,F,R,B,C,C]

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

1) 所以基本上我想确定唯一的对

2) 我还想数一数每一对出现的次数

编辑:

3)我还想知道每个节点连接到多少个不同的节点。

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


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

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

public class StringPair {
   String leftString;
   String rightString;

   //NOTE: override hashcode and equals methods
}
然后可以使用
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);
}
Map pairCountMap=newhashmap();
if(pairCountMap.containsKey(aPairObject)){
pairCountMap.put(aPairObject,pairCountMap.get(aPairObject)+1);
}否则{
pairCountMap.put(aPairObject,0);
}
哈希表(数据结构)应该适合您的要求。在爪哇,您可以考虑类型<代码> HashMap < /代码>

键是字符串对,整数是计数:

比如:

{
"AB":2,
"CR":1,
"BF":1,
...

}
查找唯一对的复杂性是
O(n)

编辑

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

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.
Map Map=newhashmap();
//您有两个包含这些字符串的列表,称为list1和list2。
//列表1和列表2的大小相同
字符串键=null;
对于(inti=0;i1,你知道,哪个字符串对不是唯一的,
//它显示了多少次。

代码不是在IDE中编写的,因此可能存在键入错误。

您需要一个类来指定对:

public class Pair{
 String prv;
 String next;
 //override hashcode and equals
}
如果使用
Set
并用all pair填充它,您将得到唯一的pair:

Set<Pair> pairs = new HashSet<Pair>();
..
pairs.add(new Pair(prv, next));
int uniquePairs = pairs.size();
此外,您可以使用
列表
集合
的组合,并应用一些逻辑来计算副本的确切数量等,还可以探索
移除所有
保留
来实现逻辑

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

要获取原始对总数的计数,请执行以下操作:

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;
Set pairs=new HashSet();
整数计数=0;
当(..){//在对的列表上迭代时
添加(新对(prv,next));
计数++;
}
int uniquePairs=pairs.size();
整数对=计数;

将其封装到一个
类中,然后使用一个集合来计数unique,使用一个列表来保存all。您需要
等于
hashCode
实现。下面是一个用于实现您自己的对类的有用资源:
我还想计算每个唯一对出现的次数。
这是什么ean?如果一对是唯一的,它只出现一次对吗?这意味着:如果我们有两对(a,B)和(B,a)。它们是两个不同的对。但是,如果我们有(a,B)和(a,B),则它们被视为一个唯一的对。这假设您可以连接字符串。@SotiriosDelimanolis OP已经这样做了,对吗?如果我理解Q正确的话。让我再读一遍。@Kent OP只提到了对;在我看来,这已经足够一般,不应该真正重要了,因为问题是关于底层数据结构,而不是数据的性质。然而,OP是一个初学者,这是一个棘手的问题,所以我不确定答案应该是多普遍的。@SotiriosDelimanolis如果有两个字符串数组/列表,只要它们具有相同的长度/大小,哈希表仍然可以工作。仍然
O(n)
(int i=0;我非常感谢你的精彩答案。由于AB不等于BA,我尝试将两个字符串放在一起,然后将它们放入哈希集中,以获得一组没有重复的字符串。这是获得唯一对的可行方法吗?如何计算一对出现的次数?使用一个集合只能告诉你有多少对是唯一的re是,但不会提供对的计数。一种方法是,在收集对时,我修改了我的答案。使用
HashMap
跟踪计数似乎是一种技巧(有效)但绝对不是正确的映射用例。我猜OP想要计算一对出现的次数。例如a->B对出现10次,B->C只出现5次等。对于这个用例,HashMap是完美的。为什么它是一个黑客?你的解决方案是计算总对数而不是单个对数。想想SQL查询中的“分组依据”功能。
Set<Pair> pairs = new TreeSet<Pair>();
..
System.out.println(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;