我想问一下我认为很简单的问题。 但是,它可能至少对我来说不是。
这里有很多字符串对。 我的问题是如何删除反转对。这是因为(A-B)和(B-A)对我来说是一样的。我想只保留一个。
Input:
A B
A C
A D
B A
C A
D A
B D
D B
Expect output
A B
A C
A D
B D
我尝试ArrayListMultimap
获取(密钥,列表)对。
(A, B; C; D)
(B, A; D)
....
但是,我仍然有(A,B)
和(B,A)
欢迎任何评论。谢谢。
答案 0 :(得分:0)
创建一个字符串列表,其中包含“AB”,“BC”等。
List<String> = new ArrayList<String>() strings;
在这里,你应该循环你的左右字符串,连接并填充List,避免你认为重复:
for(<your loop condition here, to iterate over left and right strings>) {
StringBuilder sb = new StringBuilder();
sb.append(leftString); // say "A"
sb.append(rightString); // say "B"
// now sb contains "AB"
// We only append the String if the reverse doesn't already exists in the List
if(!strings.contains(sb.reverse().toString())) // reverse yields "BA"
strings.add(sb.toString());
}
你已经完成了,你有一个没有重复的字符串列表。
如果您想要检索左右部分,只需使用substring(0,1)
和substring (1,2)
。
答案 1 :(得分:0)
我想我想出来了。这是代码
Scanner pairs = new Scanner(new File("TestSet.txt"));
ArrayListMultimap<String,String> dataset = ArrayListMultimap.create();
while (pairs.hasNextLine()){
String data0 = pairs.nextLine();
String [] array0 = data0.split("\t", 3);
String itemA = array0[0];
String itemB = array0[1];
if(dataset.containsKey(itemB) && dataset.containsEntry(itemB, itemA)){
}
else{
dataset.put(itemA, itemB);
}
}
答案 2 :(得分:0)
另一种方法(我认为更有启发性)是将一对字符串视为以下类:
class StringPair{
String s1,s2;
public StringPair(String _s1, String _s2) {
this.s1=_s1;
this.s2=_s2;
}
@Override
public boolean equals(Object other) {
if (other == null) return false;
if (other == this) return true;
if (!(other instanceof StringPair))return false;
StringPair p = (StringPair)other;
return (s1.equals(p.s1) && s2.equals(p.s2))
|| ( s1.equals(p.s2) && s2.equals(p.s1));
}
@Override
public int hashCode() {
String s;
if(s1.compareTo(s2) <= 0)
s=s1+s2;
else
s=s2+s1;
return s.hashCode();
}
}
然后使用SET实现来存储所有字符串对(这将负责删除重复项)。 Set不允许包含重复项。
引用javadoc:
如果指定的元素尚不存在,则将其添加到此集合中(可选操作)。更正式地,如果集合不包含元素e2,则将指定的元素e添加到该集合中(e == null?e2 == null:e.equals(e2))。如果此set已包含该元素,则调用将保持set不变并返回false。结合对构造函数的限制,这可以确保集合永远不会包含重复元素。
public static void main(String[] args) {
HashSet<StringPair> pairs = new HashSet<StringPair>();
pairs.add(new StringPair("A", "B"));
pairs.add(new StringPair("B", "A"));
pairs.add(new StringPair("B", "C"));
pairs.add(new StringPair("B", "C"));
pairs.add(new StringPair("B", "B"));
for (Iterator<StringPair> i = pairs.iterator(); i.hasNext();) {
StringPair stringPair = (StringPair) i.next();
System.out.println(stringPair.s1+" "+stringPair.s2);
}
}
输出:
B B A B B C