2015-11-30 51 views
0

給我的任務是直觀地舉例說明一個使用java的算法:我必須模擬堆結構。確保塗漆的字符串不會離開可見區域?

預期佈局。

The expected layout

我現在面臨的問題是如何確保在代碼區畫字符串不離開可見區域漠然的屏幕分辨率。我已經確保JFrame具有屏幕大小 - 任務欄大小。該面板被最大化,isResizable屬性爲false。

所以,我怎麼能確保該字符串不離開可見區域?

我想繪製的代碼: 如果代碼更長(Y維度),那麼容器的關注點就是X Dimension,這並不重要。

我試着一行一行的打印。

public class heap<T> 
{ 
    private ArrayList<T> h; 
    private int size; 
    private final Comparator<T> c; 

    public heap(Comparator<T> comparator) 
    { 
     h = new ArrayList<T>(); 
     h.add(null); 
     size = 0; 
     this.c = comparator; 
    } 

    public T getMin() 
    { 
     return h.get(1); 
    } 

    public T popMin() 
    { 
     T tmp = getMin(); 
     h.set(1, h.get(size)); 
     size--; 
     sift(1); 
     return tmp; 
    } 

    public void insert(T key) 
    { 
     h.add(key); 
     percolate(++size); 
    } 

    public int getSize() 
    { 
     return this.size; 
    } 

    private int getLeftSon(int i) 
    { 
     return (i<<1<=size)? i<<1 : 0; 
    } 

    private int getRightSon(int i) 
    { 
     return ((i<<1)+1<=size)? (i<<1)+1 : 0; 
    } 

    private int getFather(int i) 
    { 
     return ((i>>1)!=0)? i>>1 : 0; 
    } 

    private void swap(int i, int j) 
    { 
     T tmp = h.get(i); 
     h.set(i, h.get(j)); 
     h.set(j, tmp); 
    } 

    private void sift(int i) 
    { 
     int son; 
     do { 
      son = 0; 
      if (getLeftSon(i) != 0) 
      { 
       son = getLeftSon(i); 
       if (getRightSon(i) != 0 && c.compare(h.get(getRightSon(i)), h.get(getLeftSon(i))) > 0) 
        son = getRightSon(i); 
       if (c.compare(h.get(son), h.get(i)) <= 0) 
        son = 0; 
      } 

      if (son!=0) { 
       swap(i, son); 
       i = son; 
      } 
     } while (son!=0); 
    } 

    private void percolate(int i) 
    { 
     T key = h.get(i); 

     while ((i > 1) && (c.compare(key, h.get(getFather(i))) > 0)) 
     { 
      h.set(i, h.get(getFather(i))); 
      i = getFather(i); 
     } 

     h.set(i, key); 
    } 
} 
+0

你可以發佈一些代碼 – Ryan

+1

請給我們一個[可運行示例](http://stackoverflow.com/help/MCVE)與到目前爲止你已經嘗試...... – Frakcool

+1

*什麼「確保一個畫線不離開可見區域?」 *我通常打開'String'成'Shape'或'Area'之前畫。然後很容易獲得形狀的邊界框的高度和寬度並縮放其需要的大小。 –

回答

2

您的代碼區域是相當窄的,在單聲道空間12點字體呈現25個字符的數量級。

這裏有一個方法,如果一個字符串將適合在一個給定的像素寬度:

public boolean doesStringFit(int width, String s, Font font) { 
     FontRenderContext frc = new FontRenderContext(null, true, true); 
     Rectangle2D r2D = font.getStringBounds(s, frc); 
     int rWidth = (int) Math.round(r2D.getWidth()); 
     int rX = (int) Math.round(r2D.getX()); 
     return width >= (rWidth - rX); 
    }