Функция изменения входа - PullRequest
1 голос
/ 26 апреля 2010

Я бы хотел перейти с одного номера на другой. Например, если бы я начал с 6, а моей целью было 10, я бы хотел, чтобы функция, которая при каждом проходе приводила бы меня от 6 к 10, или, если бы у меня было число 14, а моя цель была 9, это означало бы обратный отсчет с 14 до 9. Поэтому У меня есть (это написано в Обработка Java Api, но нет принципиальной разницы с обычной Java, ничья это просто непрерывный цикл)

int x=100;
void draw(){
  x=towards(x,10);
  println(x);

}

int towards(int current ,int target){
  if(current!=target){
    if (current <target){
      current=current+1;
    }
    else {
      current=current-1;
    }
  }
  return current;
}

это дает мне результаты, которые я хотел бы получить, но я бы хотел, чтобы все было в стороне от функции direction (). Когда я заменяю X переменной, она, конечно, сбрасывает ее в статическую переменную.

Чтобы подвести итог, как я могу передать переменную в функцию и сделать так, чтобы переданная переменная изменялась при каждом последующем проходе. Я рассматривал рекурсию как решение, но оно просто приводит меня к окончательному решению. Я могу передать счет в массив, но тоже не хотел бы этого делать.

Ответы [ 2 ]

2 голосов
/ 26 апреля 2010

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

Одна вещь, которую вы могли бы рассмотреть, однако, это создать интерфейс типа итератора:

// RangeIterator.java
public class RangeIterator implements Iterator<Integer>
{
   public RangeIterator(int first, int last){
       _first = first;
       _last = last;
       if ( _first <= _last ){
           _step = 1;
       }else{
           _step = -1;
       }
   }

   public RangeIterator(int first, int last, int step){
       if ( step == 0 ){
            throw new IllegalArgumentException("Step must be non-zero.");
       }
       _first = first;
       _last = last;
       _step = step;
   }

   public boolean hasNext(){
       if ( _step < 0 ){
           return _first > _last;
       } else {
           return _first < _last;
       }
   }

   public Integer next(){
       int result = _first;
       _first += _step;
       return result;
   }

   public void remove(){
       throw new UnsupportedOperationException("Not implemented.");
   }

   private int _first;
   private int _last;
   private int _step;
}

// Range.java
public class Range implements Iterable<Integer>
{
     public Range(int first, int last){
       _first = first;
       _last = last;
       if ( _first <= _last ){
           _step = 1;
       }else{
           _step = -1;
       }
     }

     public Range(int first, int last, int step){
       if ( step == 0 ){
            throw new IllegalArgumentException("Step must be non-zero.");
       }
       _first = first;
       _last = last;
       _step = step;
     }

     public Iterator<Integer> iterator(){ 
           return new RangeIterator(_first,_last,_step); 
     }

     private int _first;
     private int _last;
     private int _step;
}

Используя приведенный выше код, вы можете легко написать что-то вроде:

Range range = new Range(x,100);
for (int val : range){
    println(val);
}

Поскольку я вижу, что вы пришли из Python, это должно выглядеть очень похоже на

for val in xrange(x,100):
    print val;

Вы можете реализовать интерфейсы Iterable и Iterator , чтобы предоставить собственные генераторы, которые можно использовать в циклах for-each в Java. По сути, for (<i>Type</i> <i>identifier1</i> : <i>identifier2</i>) выполняет итерацию содержимого identifier2 , который должен быть типом Iterable, и на каждой итерации назначает текущий элемент identifier1 . Цикл является просто синтаксическим сахаром для итерации по identifier2 .iterator ().

0 голосов
/ 26 апреля 2010

Java всегда передает int аргументы по значению. Если вы хотите сохранить состояние (особенно доступное для записи), сохраните его в объекте и (возможно) сделайте towards() методом этого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...