1

「タンパク質」、「タンパク質キナーゼ」、「機能的」、「機能的タンパク質」、「sox5」、「il-6」などのさまざまなフレーズの配列リストがあります。今、入力として文を与えると、「機能的タンパク質キナーゼおよびil-6およびsox5」、「{機能性タンパク質}キナーゼおよび{il-6}および{sox5}」として出力を提供する必要があります。文中のすべての単語をフレーズと比較する必要があります。

私が行ったコードは、さまざまなフレーズの配列リストと比較されるさまざまな文字列の開始インデックスと終了インデックスを返します。最大で衝突のないインデックスのみを除外する必要があります。たとえば、入力の場合:

[0, 7][8, 22][8, 15] [36, 43] [23, 43] [20, 30]

必要な出力:

[0, 7] [8, 22] [23, 43]

ケース:

  • [8, 22] と [8, 15] の間では、22-8 = 14 > 15-8 = 7 であるため [8, 22] が最も大きく、[8,22] を選択する必要があります。
  • [36, 43]、[23, 43] と [20, 30] の間で、36 は [23, 43] の範囲にあり、30 も [23, 43] の範囲にあります。 23, 43] が最も大きく、選択する必要があります。

必要な出力を得るにはどうすればよいですか? (比較基準)

私はやった、

ArrayList<ArrayList<Integer>> ListOfList = new ArrayList<ArrayList<Integer>>();
for(int a = 0; a<ListOfList.size();a++)
        {
            if(a == ListOfList.size()-1) break;
            for(int b = a+1; b<ListOfList.size();b++)
            {
                if((ListOfList.get(a).get(0) == ListOfList.get(b).get(0)) && (ListOfList.get(a).get(1) < ListOfList.get(b).get(1)))     
                {
                    startOffset = ListOfList.get(b).get(0);
                    endOffset =  ListOfList.get(b).get(1);
                }
                else
                {
                    startOffset = ListOfList.get(a).get(0);
                    endOffset =  ListOfList.get(a).get(1);
                }
            } 
        }
4

2 に答える 2

2

私が理解していることから、あなたの解決策は、交差するインデックスを持つすべてのペアをグループ化し、各グループで最大長のものを見つけることです。ここにいくつかの定型コードがあります。さらに明確にする必要がある場合はお知らせください。

static class Pair {public int start、end;

    Pair(int start, int end) {
        this.start = start;
        this.end = end;
    }

    public int weight() {
        return end - start;
    }

    public boolean contains(int point) {
        return start <= point && point <= end;
    }

    public String toString() {
        return String.format("[%d, %d]", start, end);
    }
}

static class Group {
    public List<Pair> pairs = new ArrayList<Pair>();
    public Pair maxWeight;

    Group(Pair start) {
        add(start);
    }

    Group(List<Pair> pairs) {
        for (Pair pair : pairs) {
            add(pair);
        }
    }

    public boolean contains(Pair pair) {
        for (Pair my : pairs) {
            if (my.contains(pair.start) || my.contains(pair.end))
                return true;
        }
        return false;
    }

    public void add(Pair pair) {
        pairs.add(pair);
        if (maxWeight == null || maxWeight.weight() < pair.weight())
            maxWeight = pair;
    }
}

public static void main(String[] args) {
    List<Pair> pairs = new ArrayList<Pair>();
    pairs.add(new Pair(0, 7));
    pairs.add(new Pair(8, 15));
    pairs.add(new Pair(8, 22));
    pairs.add(new Pair(36, 43));
    pairs.add(new Pair(23, 43));
    pairs.add(new Pair(20, 30));
    List<Group> groups = new ArrayList<Group>();

    for (Pair pair : pairs) {
        List<Group> intersects = new ArrayList<Group>();
        for (Group group : groups) {
            if (group.contains(pair)) {
                intersects.add(group);
            }
        }

        if (intersects.isEmpty()) {
            groups.add(new Group(pair));
        } else {
            List<Pair> intervals = new ArrayList<Pair>();
            intervals.add(pair);
            for (Group intersect : intersects) {
                intervals.addAll(intersect.pairs);
            }

            groups.removeAll(intersects);
            groups.add(new Group(intervals));
        }
    }

    for (Group group : groups) {
        System.out.println(group.maxWeight);
    }
}
于 2012-11-16T05:20:48.687 に答える
0

この問題に対して別の方法論を提案できるとしたら、私があなただったら単語を扱っているので、インデックスではなく実際の単語を扱うでしょう。

最初の単語をテストして、フレーズのリストにあるかどうかを確認します。そうでない場合は、テスト キューから削除します。次の単語をテストに追加して、もう一度テストします。一致が見つからなくなるまで、この方法を続けます。プロセスが完了すると、最初のフレーズ一致が得られます。

あなたの例を使用して

「機能性プロテイン キナーゼおよび il-6 および sox5」はテスト キューであり、結果は空です。

最初のテストは true を返す「機能的」になります。これは、次の単語を追加して再度テストする必要があることを意味します。

2 番目のテストは「機能性タンパク質」で true を返すため、単語を追加する必要があります

3 番目のテストは "function protein kinsae" で、これは false を返します。ここで、前のテストを成功としてマークし、キューから結果に移動します。

結果に「{機能性タンパク質}」、キューに「kinase and il-6 and sox5」

次のテストは fasle の「kinase」になるので、「kinase」をキューから結果に移動します。

結果に「{機能性タンパク質}キナーゼ」、キューに「and il-6 and sox5」

キューが空になるまでこれを続けます。

これはあなたの質問に対する直接的な回答ではないことは承知していますが、この問題を別の方法で見ることが役立つかもしれません。

于 2012-11-16T05:18:34.130 に答える