2017-01-31 4 views
1

У меня есть вопрос относительно моего Java-проекта. В школе мы начали писать метод bubblesort, который должен сортировать список целых чисел, а затем сортировать их графически. Тем не менее, моя проблема в том, что мы должны были закончить ее дома, и я, похоже, застрял с одной маленькой штукой.Java BlueJ Bubblesort

Это весь код моего Bubblesort класса:

import java.util.Random; 
/** 
* Write a description of class Bubblesort here. 
* 
* @author Aaron Zwickenpflug 
* @version 30.01.2017 
*/ 
public class Bubblesort { 
    private Random random; 
    private int maxSquare; 
    private int maxRandom; 
    private int[] x; 
    private Square[] square; 

    public Bubblesort() { 
     this.random = new Random(); 

     this.maxSquare = 100; 
     this.maxRandom = 200; 

     this.x = new int[this.maxSquare]; 
     this.square = new Square[this.maxSquare]; 

     for (int i = 0; i < this.maxSquare; i++) { 
      this.square[i] = new Square(i, x[i]); 
      this.x[i] = random.nextInt(maxRandom); 
      this.square[i].changeY(x[i]); 
      // System.out.println(this.x[i]); 
     } 
    } 

    public void redraw() { 
     for (int i = 0; i < this.maxSquare - 1; i++) { 
      this.square[i + 1].changeY(this.x[i]); 
     } 
    } 

    public void sort_bubble() { 
     int m; 
     for (int i = 1; i < 100; i++) { 
      for (int y = 0; y < this.maxSquare - i; y++) { 
       if (this.x[y] > this.x[y + 1]) { 
        m = this.x[y]; 
        this.x[y] = this.x[y + 1]; 
        this.x[y + 1] = m; 
        this.square[y + 1].changeY(this.x[i + 1]); 
       } 
      } 
     } 
    } 

} 

Вот Square класс:

import java.awt.*; 

/** 
* A square that can be manipulated and that draws itself on a canvas. 
* 
* @author Michael Kölling and David J. Barnes 
* @version 2016.02.29 
*/ 

public class Square { 
    private int xSize; 
    private int ySize; 
    private int xPosition; 
    private int yPosition; 
    private String color; 
    private boolean isVisible; 

    /** 
    * Create a new square at default position with default color. 
    */ 
    public Square(int xPos, int height) { 
     xSize = 9; 
     ySize = height; 
     xPosition = xPos * 10; 
     yPosition = 1; 
     color = "green"; 
     isVisible = false; 
    } 

    public void changeY(int x) { 
     this.ySize = x; 
     makeVisible(); 
    } 

    /** 
    * Make this square visible. If it was already visible, do nothing. 
    */ 
    public void makeVisible() { 
     isVisible = true; 
     draw(); 
    } 

    /** 
    * Make this square invisible. If it was already invisible, do nothing. 
    */ 
    public void makeInvisible() { 
     erase(); 
     isVisible = false; 
    } 

    /** 
    * Move the square a few pixels to the right. 
    */ 
    public void moveRight() { 
     moveHorizontal(20); 
    } 

    /** 
    * Move the square a few pixels to the left. 
    */ 
    public void moveLeft() { 
     moveHorizontal(-20); 
    } 

    /** 
    * Move the square a few pixels up. 
    */ 
    public void moveUp() { 
     moveVertical(-20); 
    } 

    /** 
    * Move the square a few pixels down. 
    */ 
    public void moveDown() { 
     moveVertical(20); 
    } 

    /** 
    * Move the square horizontally by 'distance' pixels. 
    */ 
    public void moveHorizontal(int distance) { 
     erase(); 
     xPosition += distance; 
     draw(); 
    } 

    /** 
    * Move the square vertically by 'distance' pixels. 
    */ 
    public void moveVertical(int distance) { 
     erase(); 
     yPosition += distance; 
     draw(); 
    } 

    /** 
    * Slowly move the square horizontally by 'distance' pixels. 
    */ 
    public void slowMoveHorizontal(int distance) { 
     int delta; 

     if(distance < 0) { 
      delta = -1; 
      distance = -distance; 
     } else { 
      delta = 1; 
     } 

     for(int i = 0; i < distance; i++) { 
      xPosition += delta; 
      draw(); 
     } 
    } 

    /** 
    * Slowly move the square vertically by 'distance' pixels. 
    */ 
    public void slowMoveVertical(int distance) { 
     int delta; 

     if(distance < 0) { 
      delta = -1; 
      distance = -distance; 
     } else { 
      delta = 1; 
     } 

     for(int i = 0; i < distance; i++) { 
      yPosition += delta; 
      draw(); 
     } 
    } 

    /** 
    * Change the size to the new size (in pixels). Size must be >= 0. 
    */ 
    public void changeSize(int newSize) { 
     erase(); 
     xSize = newSize; 
     ySize = newSize; 
     draw(); 
    } 

    /** 
    * Change the color. Valid colors are "red", "yellow", "blue", "green", 
    * "magenta" and "black". 
    */ 
    public void changeColor(String newColor) { 
     color = newColor; 
     draw(); 
    } 

    /** 
    * Draw the square with current specifications on screen. 
    */ 
    private void draw() { 
     if(isVisible) { 
      Canvas canvas = Canvas.getCanvas(); 
      canvas.draw(this, color, 
         new Rectangle(xPosition, yPosition, xSize, ySize)); 
      canvas.wait(10); 
     } 
    } 

    /** 
    * Erase the square on screen. 
    */ 
    private void erase() { 
     if(isVisible) { 
      Canvas canvas = Canvas.getCanvas(); 
      canvas.erase(this); 
     } 
    } 
} 

Теперь проблема заключается в последней строке:

this.square[y + 1].changeY(this.x[i + 1]); 

Это нормально (когда я запускаю программу) Измените координату y между 2 квадратами es и «сортировать» его. Хотя это просто испортит графику, и квадраты начинают меняться до каких-то странных значений. Я просмотрел список, который нужно отсортировать, и это работает очень хорошо.

Это как график выглядит как: Bubblesort graphics

Я надеюсь, что кто-то может помочь мне с моей проблемой. Спасибо заранее,

+0

Пожалуйста, отредактируйте ваш вопрос, чтобы включить [mcve] (в основном добавить код «Квадратный класс»), а также добавить ссылку на изображение вашей графики. –

+1

в вашем перерисовом для цикла, почему вы итерации на maxSquare - 1? Вы всегда должны итерации в зависимости от размера коллекции, которую вы итерируете. i

+0

Вы должны установить 'x [i]' перед использованием 'x [i]' в 'new Square (i, x [i]) '(если это не преднамеренно). Я считаю, что массивы 'int' инициализируют каждый индекс до' 0', поэтому вы в основном делаете 'new Square (i, 0)'. –

ответ

0

я взял некоторое время, чтобы посмотреть на свой код, я должен был признан проблемой раньше, но Canvas класс вы используете бросил меня. Поэтому я переписал программу с использованием компонентов Java Swing, а не только AWT компоненты, и после того, как я исправил одну строчку и добавил одну строку кода в методе sort_bubble(), я получил следующий результат:

Image of a sorted graph.

Проблема соврал в перекачке элементов в вашем методе sort_bubble(), или, вернее, поменять местами элементы в вашей основной int массива, но тогда не правильно обновить Square массив:

m = this.x[y]; 
this.x[y] = this.x[y + 1]; 
this.x[y + 1] = m; 
this.square[y + 1].changeY(this.x[i + 1]); 

Выше вы обменивать x[y] с x[y + 1], но по какой-то причине вы обновляете square[y + 1] со значением x[i + 1]. Ваши обновления массива Square должны отражать ваши свопы в базовом массиве int. Поэтому ваша замена и обновление кода в sort_bubble() должен выглядеть следующим образом:

m = this.x[y]; 
this.x[y] = this.x[y + 1]; 
this.x[y + 1] = m; 

// reflect the above swaps when updating 'this.square' 
this.square[y].changeY(this.x[y]); 
this.square[y + 1].changeY(this.x[y + 1]); 


Надеюсь, что это ответ помогает и жаль, что потребовалось некоторое время, чтобы ответить. Дайте мне знать, если у вас возникнут дополнительные вопросы относительно того, что я упомянул в этом ответе.