给我的任务是用java直观地举例说明算法:我必须模拟堆结构。
预期的布局。
我面临的问题是如何确保代码区域中的绘制字符串不会与屏幕分辨率无关地离开可见区域。我已经确保JFrame具有屏幕大小 - 任务栏大小。面板最大化,isResizable属性为false。
那么如何确保字符串不会离开可见区域?
我想要绘制的代码: 如果代码更长(Y维度)容器对其重要的是X维度,则无关紧要。
我尝试逐行打印。
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 :(得分:2)
您的代码区域相当窄,大约25个字符,以单声道空格12磅字体呈现。
这是查看字符串是否适合给定像素宽度的一种方法:
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);
}