1

アプリケーションのヘルプ システムを構築しています。ヘルプ システムは、ツールバー ツリーとブラウザ ペインを備えたシェルで構成されています。ツリーはファイルをノードにロードし、リンクをクリックするとブラウザーで HTML ファイルが開きます。ツールバーのボタンがクリックされると、 text = browser.getText() が呼び出され、テキストがバッファーを介して HTML タグ ストリッパーに読み込まれ、3 つの配列に収集されてから、styledtext エディターのスタイル クリエーターに解析されます。

  • バッファはタグリーダークラスに統合されています。アプリケーションのどこでも必要なときに使用するグローバルクラスを作成したかったのですが、buffer.class に解析されたときに char 文字列などを定数化する際に問題が発生しました。
  • 配列は、リーダーによって検出されたタグで埋められた 3 つの配列で構成されています。グローバルに機能する add メソッドを使用して、必要に応じてアプリケーションで使用したかったのです。

  • List list = new ArrayList(); を使用できます。しかし、オーバーヘッドでの使いやすさと理解を深めるために、代わりに配列だけを使用しようとしました。

    public class XMLHtmlTagReader {
     private static  char startchar = '<';
     private static  char endchar= '>';
     private static  char[] closingchar ={'<','/'};
     private static  String startTag;
     private static  String endTag;
     private static  String tagValue;
     static String[] starttaglist = new String[]{"first","second","third","fourth"};
     static String[]tagvaluelist;// = new String[1];
     static String[] endtaglist;// = new String[1];
     int tagcount=0;
     static char newchar;
     static char newchar1;
     static int i=0;
     static int startcharint = -1;
     static int endcharint = -1; 
     static int closingcharint = -1;
     static int level=0;
     static int elm=0;
     boolean closing = false;
     static Object store[] = new Object[26];
     Object[][][] megastore = new Object[50][50][50];
     int storeCounter = 0;
     int count=-1;
     int Wmstore=0,WstoreCounter=0,Wv=0;
     int Rmstore=0;
     static int RstoreCounter=0;
     static int Rv=0;
     static int Rtmp;
     int Omstore=0;
     static int OstoreCounter=0;
     static int Ov=0;
     int mstore=0;
     long time =   3087;
    
    public static void main(String[] args) {
         XMLHtmlTagReader run=new XMLHtmlTagReader();
     }
    
     XMLHtmlTagReader(){
         long memstart = (Runtime.getRuntime().totalMemory()-       Runtime.getRuntime().freeMemory());
     System.out.println("Memory at start:"+memstart);
     long startTime = System.nanoTime();
     getStream("<html><title>hallo de titel ...</title><p>Dit is de text.</p><b>dikke text</b></html>");
     //for(int t=0;t<100000;t++){new com.pim.Buffer(endchar);}
     long estimatedTime = (System.nanoTime() - startTime);  
         //(System.currentTimeMillis() - startTime);
         //(System.nanoTime() - startTime)/1000000;
         //long calc = (estimatedTime/time)*100;
     System.out.println(memstart+"memstart  "+"execution time = "+estimatedTime+" is % sneller/langzamer  = "+(estimatedTime/time)*100+"Memory = "+(Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory()));
    bufferWrite('E');
     }
    
    public static String getStream(String input) {
    
         while(input != null){
                            i++;
                try {
                    newchar = input.charAt(i);
                    }
                catch (java.lang.StringIndexOutOfBoundsException exception){
                    break;
                    }
                if(newchar!=closingchar[1]&&input.charAt(i-1)==startchar){
                    startcharint=i;
                            level++;
                }
                if(newchar==closingchar[1]&&input.charAt(i-1)==startchar) {
                    closingcharint=i;
                    tagValue = input.substring(endcharint+1,closingcharint-1);
                    if(tagValue!=null){log("valuetag ["+tagValue+"]->"+endcharint+" ->"+closingcharint);}
                }
                 if(newchar==endchar)  {
                                            endcharint=i;
                                            if(startcharint>=0){
                                                startTag = input.substring(startcharint-1,endcharint+1);
                                                    log("starttag "+startTag);
                                            }
                                            else {startTag=" no Start tag found "; }
                                            if(closingcharint>0){
                                                endTag = input.substring(closingcharint-1,endcharint+1);
                                                level--;
                                                    log("endtag->"+endTag);
                                                    log("level->"+level);
                                            }
                                            else {  endTag=" no end tag found "; }
                                            closingcharint=0;
                                            startcharint=-1;
                                        }   
                    }
        startchar = 0;
        endchar = 0;
        closingchar = null;
        newchar = 0;
        newchar1 = 0;
        return input;
    }
    private static  void addElementToArray(String string){
        String[] tmpArray;
        int length = starttaglist.length;
        tmpArray = new String[length+1];
        System.arraycopy(starttaglist, 0,tmpArray , 0, length);
        tmpArray[length] = new String(string);
        starttaglist = null;
        starttaglist = new String[length+1];
        System.arraycopy(tmpArray, 0,starttaglist , 0, length+1);
        for(String tmp:starttaglist){
            System.out.println("Elements in Array  "+tmp);
            }
        tmpArray = null;
    }
    public static String[] getStartTag(){
        return starttaglist;
    }
    public static  String[] getTagValue(){
        for(String tmp:tagvaluelist){
    
        }
        return tagvaluelist;
    }
    public static  String[] getEndTag(){
        return endtaglist;
    }
    
    
    static Object bufferWrite(char value){
        store[OstoreCounter] =  new Object();
        store[OstoreCounter] = value;
        //System.out.println("bufferWrite=["+OstoreCounter+"] storeValue=["+store[OstoreCounter]+"] Ov="+Ov);
        if(Ov==30&&store[RstoreCounter] == null){
            Rtmp=Ov;
            Ov=0;
            }
        if(Ov==40){
            OstoreCounter++;
            Ov=0;
            }
            Ov++;
             char tmp  = (char)  bufferRead();
             return tmp;
    }
    
     static Object bufferRead(){
        Object tmp = store[RstoreCounter];
        //System.out.println("bufferRead=["+RstoreCounter+"] storeValue= ["+store[RstoreCounter]+"] Rv="+Rv);
        store[RstoreCounter] =  null;
        if(Rv==Rtmp){
            Rv=0;
            }
        if(Rv==40){
                RstoreCounter++;
                Rv=0;
                }
        //System.out.println("bufferRead reads till end of int"+Rtmp);
            Rv++;
            return tmp;
    }
    
    
    
    
     static void log(String txt){
                System.out.println(txt);
                }
    }
    
4

6 に答える 6

0

メソッドへの配列参照の解析を完了できませんでした

        private void addElementToArray(String string, String[] obj);

代わりに、メインメソッドの横にコードを含めましたが、これは最もクリーンな方法ではありませんが、うまく機能します。

        tagValue = input.substring(endcharint+1,closingcharint-1);
        tmpArray = new String[tagvaluelist.length+1];
        System.arraycopy(tagvaluelist, 0,tmpArray , 0, tagvaluelist.length);
        tmpArray[tagvaluelist.length] = new String(tagValue);
        tagvaluelist = null;
        tagvaluelist = new String[tmpArray.length];
        System.arraycopy(tmpArray, 0, tagvaluelist , 0, tmpArray.length);
        tmpArray = null;

プリミティブcharを除くBufferクラスの場合、charをBufferクラスのオブジェクトとして解析するソリューションを見つけました。これは機能しますが、Javaのルールに従っていることを願っています。

            newchar1 = input.charAt(i);
        Buffer buffer =  new Buffer(newchar1);
        buffer.buffer(newchar1);
            newchar = newchar1; // to test its going through the buffer

バッファクラス:

     package com.test;


    public class Buffer {
         Object store[] = new Object[26];
         Object[][][] megastore = new Object[50][50][50];
         int Wmstore=0,WstoreCounter=0,Wv=0;
         int Rmstore=0,RstoreCounter=0,Rv=0,Rtmp;
         int Omstore=0,OstoreCounter=0,Ov=0;
         int mstore=0;
     public Object buffer(Object obj){
        return new Buffer(obj);}
 public Buffer(Object obj){
                bufferWrite(obj);
                store = null;
                megastore = null;
    }
Object bufferWrite(Object obj){
        store[OstoreCounter] =  new Object();
        store[OstoreCounter] = obj;
        System.out.println("bufferWrite=["+OstoreCounter+"] storeValue=["+store[OstoreCounter]+"]");// Ov="+Ov);
        if(Ov==30&&store[RstoreCounter] == null){
            Rtmp=Ov;
            Ov=0;
            }
        if(Ov==40){
            OstoreCounter++;
            Ov=0;
            }
            Ov++;
             Object tmp  =   bufferRead();
             return tmp;
    }

     Object bufferRead(){
        Object tmp = store[RstoreCounter];
        System.out.println("bufferRead=["+RstoreCounter+"] storeValue=["+store[RstoreCounter]+"]");// Rv="+Rv);
        store[RstoreCounter] =  null;
        if(Rv==Rtmp){
            Rv=0;
            }
        if(Rv==40){
                RstoreCounter++;
                Rv=0;
                }
        //System.out.println("bufferRead reads till end of int"+Rtmp);
            Rv++;
            return tmp;
    }
     void log(String txt){
                System.out.println(txt);
                }
      }
于 2012-11-11T11:13:08.723 に答える
0

intはオブジェクトではありません

で試してみてください

Integer i = new Integer[10];

これはうまくいくでしょう

于 2012-11-09T06:14:46.170 に答える
0
int is not a subclass of Object

しかし、Java 5auto Boxing以降では、プリミティブ データ型をそれぞれのラッパー クラスに変換する1 つの概念が呼び出されます。
add(6, i);

6そこのラッパークラスに自動的に変換されますInteger。ただし、i関数はオブジェクトの配列を使用しますがi、整数の配列を使用するため、問題があります。これは、AutoBoxing を使用して JVM で変換することはできません。

したがって、試しadd(6, string);てもエラーは表示されません。

于 2012-11-09T06:22:59.400 に答える
0

-まずintcharbooleanbyteshort、 などはプリミティブ型です。

-Wrapper Object上記のうち、 Java 5primitivesの登場に伴い、この機能が呼び出されて登場しました。Auto-BoxingUn-Boxing

例えば:

int i = 5;

Integer intObj = new Integer(i);

メソッドの定義は次のとおりです。

public <T extends Object> void doIt(ArrayList<T> arr){}

また

public void doIt(ArrayList<? extends Object> arr){}

于 2012-11-09T06:23:42.627 に答える
0

intはのサブクラスではありませんObjectInteger

于 2012-11-09T06:16:16.647 に答える
0

Objectのようなプリミティブのスーパークラスではなく、int型のスーパークラスですInteger。別の問題はあなたの宣言です。両方ではなく、長さまたは初期値を使用します。

Integer[] i = new Integer[] {0, 1, 2, null, null, null, null, null, null, null};
Integer[] i = new Integer[10];

一般的なメソッドを記述するには、ジェネリックを使用する必要があります。

void <T> add(T object , T[] lateral);

次の問題は、配列の長さが固定されているため、拡張できないことです。インデックスは常に [0..length-1] の範囲内にある必要があり、長さや長さ + 1 になることはありません。これを行うには、次を使用する必要がありますList

List<T> lateral = new ArrayList<Integer>();

void <T> add(T object , List<T> lateral) {
  literal.add(object);
}

配列でこのようなことを行う唯一の方法は、新しい値を最初の非 null 位置に配置することです。

void <T> add(T object , T[] lateral) {
  for (int i = 0; i < lateral.length; ++i) {
    if (lateral[i] == null) {
      lateral[i] = object;
      return;
    }
  }
  throw new IllegalStateException("array to short, no null value found to insert " + object);
}

PS: これはすべて Java 5 コードです。以前のバージョンでは動作しません。

于 2012-11-09T06:22:02.673 に答える