2016-01-13 78 views
-3

我想问一个我认为很简单的问题。 但是,这可能不是至少对我来说。删除倒车对

这里有很多字符串对。 我的问题是如何删除反转对。这是因为(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得到(key,List)对。

(A, B; C; D) 
(B, A; D) 
.... 

不过,我还是有(A,B)(B,A)
任何意见都欢迎。谢谢。

+1

可能有很多种方法。你应该显示你的代码。 –

+0

什么是数据结构 – madhairsilence

+0

尝试一些思考,并回来,如果你有它的问题 – Jens

回答

0

创建一个字符串列表,其中将包含“AB”,“BC”,等等。

List<String> = new ArrayList<String>() strings; 

在这里,你应该在你的左边和右边的字符串环,串联和填充列表,避免你认为是重复的东西:

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)即可。

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); 
      } 
     } 
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不允许包含重复项。

引述的Javadoc:

添加到此组指定元素,如果它不是已存在的(可选操作)。更正式地说,如果该集合不包含元素e2(e == null?e2 == null:e.equals(e2)),则将指定的元素e添加到该集合中。如果此集合已包含该元素,则该呼叫将保持集合不变并返回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