0

我有一个向量,其中每个对象都是一个元组,其中包含例如:<-1,2,3,45.67> 的类型。现在我有大量的这些元组,我怎样才能找到这些元组中的所有模式,我不知道它们的起点和终点以及有多少这样的模式。
需要找出所有不同的模式以及它们出现的次数?

前任:

<1,2,2,68.8752808539275><-1,1,2,68.8752808539275><-1,-2,2,112.60225083387081> <-2,0,2,158.8752808539275> <1,2,2,68.8752808539275> ,2,68.8752808539275><-1,-2,2,112.60225083387081>

现在我需要将前三个元组与最后一个元组匹配,因为它们是相同的。
我怎样才能在Java中做到这一点?

我的输入只是一个对象向量,其中每个对象都有一个类的上述字段,我没有给出搜索模式,它应该识别向量中的所有不同模式..

4

2 回答 2

0

考虑咆哮类

class Tuple<A,B,C,D>{

  public Tuple(A a,B b,C c, D d){
 ...
  }

@Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((a == null) ? 0 : a.hashCode());
        result = prime * result + ((b == null) ? 0 : b.hashCode());
        result = prime * result + ((c == null) ? 0 : c.hashCode());
        result = prime * result + ((d == null) ? 0 : d.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Tuple other = (Tuple) obj;
        if (a == null) {
            if (other.a != null)
                return false;
        } else if (!a.equals(other.a))
            return false;
        if (b == null) {
            if (other.b != null)
                return false;
        } else if (!b.equals(other.b))
            return false;
        if (c == null) {
            if (other.c != null)
                return false;
        } else if (!c.equals(other.c))
            return false;
        if (d == null) {
            if (other.d != null)
                return false;
        } else if (!d.equals(other.d))
            return false;
        return true;
 }
}
于 2013-09-12T11:10:39.257 回答
0

我会做以下事情:

  • 首先,使用正则表达式来获取实际的字符串,代表一个元组。(<[^>]+>)
  • 创建一个 Tuppel 类,在构造函数中接受它,根据需要实现 equals 和 hashcode 方法,并在迭代时将所有结果添加到集合中。

班级:

Class MyTupel{
  private int a;
  private int b;
  private int c;
  private double d;

  public MyTupel(String tupel){
    //Regex to match a,b,c,d over here: ^<(\d+),(\d+),(\d+),([^>]+)>$
  }

  public boolean equals(MyTupel another){
    return (a == another.getA() && b == another.getB() && c = another.getC() && d == another.getD())
  }

  @Override
  public int hashCode(){
     return a+b+c+ (int)Math.floor(d);
  }

  //getter and setter
}

最后你可以像(口头)一样使用它:

  • 创建 MyTuppel(或集合)列表
  • foreach 匹配字符串“<1,2,2,68.8752808539275>....”
  • 创建 Tuppel-Instance ( Tuppel t = new Tuppel(match))
  • 如果没有列表包含 tuppel:添加 tuppel。
于 2013-09-12T10:51:46.423 回答