2015-01-19 1 views
-1

Я пишу программу для определения того, какие прямоугольники пересекаются друг с другом на основе прямоугольников и угловых координат, которые вводит пользователь. Я пытаюсь создать цикл for, который проверяет каждый прямоугольник, прямоугольники которого (вход пользователя) пересекают его. В цикле, я пытаюсь сделать программу проверкой один прямоугольника с любым другим прямоугольником, чтобы увидеть, если они пересекаются и пытаюсь сделать это следующим образом:Как вы делаете значение внутри цикла for, которое не является значением i, постепенно уменьшается?

package a1; 
import java.util.Scanner; 
public class A1Jedi { 
    public static void main(String[] args) { 
      Scanner s = new Scanner(System.in); 

      process(s); 
    } 

    public static void process(Scanner s) { 
     String[] rectnames; 
     int[] xcoordinate1; 
     int[]ycoordinate1; 
     int[]xcoordinate2; 
     int[]ycoordinate2; 
     int[]xcoordinate3; 
     int[]ycoordinate3; 
     int[]xcoordinate4; 
     int[]ycoordinate4; 
     String[] intersectrectnames; 

     System.out.println("Please enter the number of rectangles as an integer"); 


     int rectnum; 
     rectnum = s.nextInt(); 

     rectnames = new String[rectnum]; 
    xcoordinate1 = new int[rectnum]; 
    ycoordinate1 = new int[rectnum]; 
    xcoordinate2 = new int[rectnum]; 
    ycoordinate2 = new int[rectnum]; 
    xcoordinate3 = new int[rectnum]; 
    ycoordinate3 = new int[rectnum]; 
    xcoordinate4 = new int[rectnum]; 
    ycoordinate4 = new int[rectnum]; 
    intersectrectnames = new String[rectnum-1]; 

     for(int i = 0; i<rectnum; i++){ 
      System.out.println("PLease enter the rectangle's name as a single letter"); 

      String rectname; 
      rectname = s.next(); 
      rectnames[i] = rectname; 

      System.out.println("Please enter the x value of one coordinate of the rectangle"); 
      int xcoor1; 
      xcoor1 = s.nextInt(); 
      xcoordinate1[i]= xcoor1; 

      System.out.println("Please enter the y value of the same coordinate of the rectangle"); 
      int ycoor1; 
      ycoor1 = s.nextInt(); 
      ycoordinate1[i]= ycoor1; 

      System.out.println("Please enter the x value of annother coordinate of the rectangle"); 

      int xcoor2; 
      xcoor2 = s.nextInt(); 
      xcoordinate2[i]= xcoor2; 

      System.out.println("Please enter the y value of the same coordinate of the rectangle"); 
      int ycoor2; 
      ycoor2 = s.nextInt(); 
      ycoordinate2[i]= ycoor2; 
     } 


      for(int a=0; a < rectnum; a++) { 
      for(int b=a+1; b < rectnum; b++) { 

     if ((xcoordinate1[a]< xcoordinate2[b]) && (xcoordinate2[a] > xcoordinate1[b]) 
     && (ycoordinate1[a] < ycoordinate2[b]) && (ycoordinate2[a] > ycoordinate1[b])){ 

      intersectrectnames[a] = rectnames[b]; 


     System.out.println(intersectrectnames[a]); 
     } 
     } 
     }}} 
+1

Какая ошибка дает вам? –

+0

Исключение в потоке "основного" java.lang.ArrayIndexOutOfBoundsException: -1 \t в a1.A1Jedi.process (A1Jedi.java:71) \t в a1.A1Jedi.main (A1Jedi.java:7) – user3440080

+2

Вы действительно намерены уменьшать «rectnum» пять раз за цикл? Потому что это то, что ваш код в настоящее время пытается сделать. – eldarerathis

ответ

3

Вашего код декремент rectnum пять раз в циклю. Это уже происходит в верхней части цикла для каждой итерации. Операция --rectnumизменяется значение rectnum.

for(int i = 0; i < --rectnum; i++) { // pre-decrement here 

    if ((xcoordinate1[i] < xcoordinate2[rectnum]) && 
     (xcoordinate2[i] > xcoordinate1[rectnum]) && 
     (ycoordinate1[i] < ycoordinate2[rectnum]) && 
     (ycoordinate2[i] > ycoordinate1[rectnum])) { 

     intersectrectnames[i] = rectnames[rectnum]; 

    } 
} 

Чтобы иметь это в пять раз, как вы делали, не изменяя его, код будет, как это (возможно, я не знаю, что полный код делает.):

for(int i = 0; i < rectnum; i++) { 

    if ((xcoordinate1[i] < xcoordinate2[rectnum-1]) && 
     (xcoordinate2[i] > xcoordinate1[rectnum-1]) && 
     (ycoordinate1[i] < ycoordinate2[rectnum-1]) && 
     (ycoordinate2[i] > ycoordinate1[rectnum-1])) { 

     intersectrectnames[i] = rectnames[rectnum-1]; 

    } 
} 
+0

Ок, да, я думаю, я вижу, где я перепутал сейчас. подумайте, что for (int i = 0; i <--rectnum; i ++, rectnum -) {будет работать – user3440080

+0

Итак, вы все еще хотите, чтобы он уменьшался дважды в объявлении цикла? И '--rectnum', и' rectnum - 'уменьшают его. – mbomb007

+0

@ user3440080 Нет, это уменьшило бы его дважды за цикл. Вероятно, вы хотите 'for (int i = 0; i Hosch250

0

Вы нужны две петли, так как вы хотите пройти через пары прямоугольников. В этом случае внутренний цикл начинается с того, который сравнивали уже избежать сравнивать их два раза:

int recnum = xcoordinate1.length; // or any other way 
for(int a=0; a < recnum; a++) { 
    for(int b=a+1; b < recnum; b++) { 
    if ((xcoordinate1[a] < xcoordinate2[b] ...) 
    { 
     System.out.println("rectangle " + a + " and " + b + " intersect"); 
    } 
    } 
} 

это сравнение (если у вас есть 4 прямоугольника)

a=0 with b=1, b=2, b=3 
a=1 with b=2, b=3 
a=2 with b=3 

внешний контур будет затем попробуйте сравнить a = 3, но внутренний цикл начинается с b=3+1, который не менее 4, поэтому он больше не выполняется.

Ваш первоначальный вопрос касался переменных цикла, поэтому я пропускаю логику if. Однако вам нужно также улучшить свой код if, он должен проверять все различные случаи, как переносы могут быть размещены относительно друг друга (и в обоих измерениях). Подсказка: если значение имеет не менее 2 & & комбинированные выражения, которые содержат несколько орлов. Вы можете либо сделать это в более крупном заявлении, которое учитывает все разные комбинации (кто больше левый и более вниз), или вы сначала назначаете тот, который наиболее левый и самый нижний, и сравнивайте это с этим фактом.

+0

Добавьте описание к вашему ответу. – mbomb007

+0

@ mbomb007 уверен, введите ключ, посланный слишком быстро :) (и вы, ребята, никому не даете второй, чтобы исправить) – eckes

+0

Я удалил свой -1. Благодарю. – mbomb007

 Смежные вопросы

  • Нет связанных вопросов^_^