0

与えられたグラフの形を変えたい。グラフの形式は、userID、フォロワー数、follower1、follower2、..followerN、区切り文字「---」、userID2、などです。

フォロワーを、ID1 place1 ID2 place2 .... の形式の 2 番目のファイルの場所の値に置き換える必要があります。

IDを一致させることによって。

したがって、フォロワーIDが毎回セットに存在するかどうかを確認したいと思います。私のグラフと、フォロワー ID を求めるセットの両方が巨大です。

以下に示す方法よりも効率的な方法はありますか?

 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.DataInputStream;
 import java.io.FileInputStream;
 import java.io.FileWriter;
 import java.io.InputStreamReader;
 import java.util.*;


public class Changer {
public static void main(String[] args) {


       Set set = new HashSet();
       int[][] users=new int[61578415][];



                 try{
        FileInputStream fstream2 = new FileInputStream(args[0]);
        DataInputStream in2 = new DataInputStream(fstream2);
        BufferedReader br2 = new BufferedReader(new InputStreamReader(in2));
        String strLine2;


                 while ((strLine2 = br2.readLine()) != null)   {  
                    set.add(strLine2);
                 }

                 in2.close();
                 fstream2.close();}
                 catch (Exception e){
        System.err.println("Error: " + e.getMessage()+"!\n"+e.toString()+"!\n");
        e.printStackTrace();
        System.exit(-1);
           }


           try{

        FileInputStream fstream = new FileInputStream("InputGraph.txt");
        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String strLine;
        int flag=0;
        int pos=0;


                 FileWriter fstream3 = new FileWriter("OutputGraph.txt");
        BufferedWriter out = new BufferedWriter(fstream3);


        int currentUser=0,counter=0;
        int theNum=0;
        while ((strLine = br.readLine()) != null)   {
            if(strLine.equals("---")){
                if(counter!=pos){
                    System.out.println("Error reading graph");
                    System.out.println("For:"+currentUser);
                    System.exit(-1);
                }
                flag=0;
                pos=0;
                continue;
            }

            theNum=Integer.parseInt(strLine);

            if (flag==0){

                           out.write("---"+"\n");

                           out.write(""+theNum);
                           out.write("\n");

                           currentUser=theNum;
               flag+=1;
            }
            else if (flag==1){
                counter=theNum;
                users[currentUser]=new int [counter];
                flag+=1;
                               out.write(""+theNum+"\n");
            }
            else{
                users[currentUser][pos]=theNum; 
                ++pos;

                               Iterator it = set.iterator();
                               while (it.hasNext()) {
                                 Object element = it.next();
                                 String[] arr = (String.valueOf(element)).split(" ");
                                 if (Integer.parseInt(arr[0])==theNum)
                                    {theNum=Integer.parseInt(arr[1]);break;}
                                 }


         out.write(""+theNum);
         out.write("\n");
            }
        }
        in.close();
         out.close();
    }catch (Exception e){
        System.err.println("Error: " + e.getMessage());
    }

    System.out.println("Graph has been read");
    System.gc();
    System.gc();


    System.out.println("Finished");
  }

   }
4

2 に答える 2

1

内部でfor ループを実行する方が効率的intersectionです。これにより、分割と解析があまり行われなくなります。

Iterator it = set.iterator();
while (it.hasNext()) {
    Object element = it.next();
    String[] arr = (String.valueOf(element)).split(" ");
    int arr0 = Integer.parseInt(arr[0]);
    int arr1 = Integer.parseInt(arr[1]);
    for (int integer : intersection) {
       if (arr0 == integer) {
          out.write(integer + " " + arr1 + "\n");
       }
    }
}

ただし、これにより、書き込みが呼び出される順序が変更されます。

ただしHashMap、またはにロードする(または単に置き換える)ことでメリットがあると思われますSparseArray。あなたが与えた情報を与えるのは難しいです。

于 2014-04-02T11:08:34.547 に答える
0

整数検出の場合、 instanceofとの比較を使用できますが、プリミティブではなくオブジェクトを使用する必要があります。次に例を示します。

            Integer a=Integer.parseInt("12345");
            if(a instanceof Integer){
            System.out.println("We have an integer !"); 
            }

整数検出のもう 1 つの方法は、equals メソッドをオーバーライドすることです。

于 2014-04-02T11:45:28.567 に答える