2016-01-13 79 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