取下反转对

时间:2016-01-13 09:35:17

标签: java string replace

我想问一下我认为很简单的问题。 但是,它可能至少对我来说不是。

这里有很多字符串对。 我的问题是如何删除反转对。这是因为(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)
欢迎任何评论。谢谢。

3 个答案:

答案 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