0

このファイルには約 1000 の重複したフレーズがあるので、これを手動で行うことはできません。これらは句であり、行や単語ではなく、各「句」の長さは約 10 行であることに注意してください。

重複したフレーズを取り除こうとしていますが、「項目」(またはフレーズ) を重複させる唯一のものは位置構文です。例えば:

    class Item0
    {
        position[]={4347.6001,0,3214.6399};
        azimut=128.81599;
        special="NONE";
        id=1;
        side="EMPTY";
        vehicle="Land_fortified_nest_small";
        lock="UNLOCKED";
        skill=0.2;
        init="this setPos [4347.6, 3214.64, 0]; this setDir 128.816;";
    };
    class Item1
    {
        position[]={4347.6001,0,3214.6399};
        azimut=128.81599;
        special="NONE";
        id=2;
        side="EMPTY";
        vehicle="Land_fortified_nest_small";
        lock="UNLOCKED";
        skill=0.2;
        init="this setPos [4347.6, 3214.64, 0]; this setDir 128.816;";
    };

前の 2 つのフレーズは重複していますが、ID と ITEM 番号が異なるため、重複したフレーズを識別する唯一の方法は、position[]={} パラメーターを使用することです。2 つのフレーズが同じ位置にある場合、これら 2 つのフレーズは ID や ITEM# に関係なく重複しています。

したがって、私の目標は、ある種のコード、スクリプト、プログラム、または正規表現を使用してすべての重複フレーズを削除し、最初の重複フレーズはそのままにすることです。したがって、重複が 3 つある場合は、1 つのフレーズが残りますが、2 つのフレーズは削除されます。どうすればこれを行うことができますか?


望ましい入出力の例:

入力:

    class Item0
    {
        position[]={4347.6001,0,3214.6399};
        azimut=128.81599;
        special="NONE";
        id=1;
        side="EMPTY";
        vehicle="Land_fortified_nest_small";
        lock="UNLOCKED";
        skill=0.2;
        init="this setPos [4347.6, 3214.64, 0]; this setDir 128.816;";
    };
        class Item1
    {
        position[]={4682.6001,0,3847.6399};
        azimut=128.81599;
        special="NONE";
        id=2;
        side="EMPTY";
        vehicle="Land_fortified_nest_small";
        lock="UNLOCKED";
        skill=0.2;
        init="this setPos [4682.6, 3847.64, 0]; this setDir 128.816;";
    };
        class Item2
    {
        position[]={4347.6001,0,3214.6399};
        azimut=128.81599;
        special="NONE";
        id=3;
        side="EMPTY";
        vehicle="Land_fortified_nest_small";
        lock="UNLOCKED";
        skill=0.2;
        init="this setPos [4347.6, 3214.64, 0]; this setDir 128.816;";
    };

出力:

    class Item0
    {
        position[]={4347.6001,0,3214.6399};
        azimut=128.81599;
        special="NONE";
        id=1;
        side="EMPTY";
        vehicle="Land_fortified_nest_small";
        lock="UNLOCKED";
        skill=0.2;
        init="this setPos [4347.6, 3214.64, 0]; this setDir 128.816;";
    };
        class Item1
    {
        position[]={4682.6001,0,3847.6399};
        azimut=128.81599;
        special="NONE";
        id=2;
        side="EMPTY";
        vehicle="Land_fortified_nest_small";
        lock="UNLOCKED";
        skill=0.2;
        init="this setPos [4682.6, 3847.64, 0]; this setDir 128.816;";
    };
4

3 に答える 3

0

クラス型の場合は、SET の使用を検討してクラス要素を追加できます。

      Set<Item> itemSet  = new HashSet<Item>;
      itemSet.add(new Item());

すべてのアイテムを追加すると、一意のアイテムだけが残ります。

ID を競合から除外し、アイテムが挿入されたかどうかを確認することで、どの ID が挿入されたかを引き続き確認できます。これは、ID が適切であることを考慮して機能します。ID を除外するには、ID を除く同じデータ メンバーを持つ新しいクラスを使用します。

別の例を使用しました(作成は簡単でした)それが役立つことを願っています

    int item[] = null;
    int offset = 0;
    int counter = 0;
    ArrayList<Integer> duplicateids = new ArrayList<Integer>();
    Set<Integer> afterDups= new HashSet<Integer>();
    for (int i : item) {
        counter++;
        //you can create a new class excluding the id and initialize it here
        if(!afterDups.add(i))
            duplicateids.add(counter);
    }

編集 :

さて、ファイルから選択することを逃したので、この回答を追加します。各行を確認できます。ファイルがこの形式であるため、行を比較したくないでしょClass Item0id=1;。あとは、ファイルを 1 行ずつ読み取り、文字列に配置できます。クラスが完了すると (行の先頭が で示されclassます)、テキスト用に別の文字列を作成するように設定できます。id資格情報 (および)からデータを分離しますclass。文字列を再度分割してファイルを再作成できるセパレータを使用します。

public static void main(String args[])
{
    try{
        FileInputStream fstream = new FileInputStream("file.txt");
        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String strLine;
        String seperator = "$$";
        //this contains the $$ seperated class data items
        String currentClassText = "";
        //this contains the $$ seperated class name the opening braces and the closing braces
        String  currentClassCredentilas= "";
        Set<String> texts = new HashSet<String>();
        ArrayList<String> credentials = new ArrayList<String>();
        while ((strLine = br.readLine()) != null)   {
            if(strLine.contains("id=") || strLine.contains("class") || strLine.contains("};"))
                currentClassCredentilas.concat(strLine + seperator);
            else
                currentClassText.concat(strLine + seperator);

            //check if the class has completed
            if(strLine.contains("};")){
                //text is not a duplicate
                if(texts.add(currentClassText)){
                    credentials.add(currentClassCredentilas + seperator);
                }
                //set everything back to empty for the next round
                currentClassCredentilas = currentClassText = "";
            }
            System.out.println (strLine);
        }
        in.close();
    }catch (Exception e){
        System.err.println("Error: " + e.getMessage());
    }
}
于 2012-04-06T17:12:32.473 に答える
0

私の最初のアプローチは次のとおりです。

  1. 一意の位置を格納する配列を作成します
  2. ファイルを解析し、位置が配列内にある場合はスキップします。それ以外の場合は、ファイルに出力して配列に保存します。
  3. EOF までループする

これにより、必要なものが得られますが、最適なソリューションではありません。アイテムの最初の遭遇を保存する方法と、後でそれを確認する方法を検討してください (配列のスキャンには時間がかかる場合があります)。

于 2012-04-06T16:59:45.223 に答える
0

各フレーズのハッシュ値を生成し、マップに保存します。新しいフレーズを追加し続け、既に存在する場合は無視します。ハッシュ コードとマップ値は常に一意であるため、重複することはありません。

于 2012-04-06T17:34:36.290 に答える