2015-05-27 2 views
2

Во время вызова метода compute(ee, temp1, s1, k) из метода smaller() значение аргумента, которое проходит мимо, не такое же, как тот, который я получаю, может ли кто-нибудь помочь мне с этой проблемой?Pass by Reference issue-Java

* Это мое заявление о проблеме. Получите наименьшее число после удаления k цифр из номера ввода. Например, если входной номер равен 24635, наименьшее число равно 23 после удаления 3 цифр.

Я ожидаю, что конечный результат будет 23, но получится бесконечный цикл.

public class Delete3 { 


    public static void main(String[] args) { 
     int k = 3; 
     int num = 24635; 
     StringBuffer num1 =new StringBuffer(Integer.toString(num)); 
     int temp = 0; 
     StringBuffer s = new StringBuffer(num1); 
     temp = Integer.parseInt(s.deleteCharAt(0).toString()); 
     temp = compute(num1, temp, s, k); 
     System.out.println(temp); 
    } 

    static int compute(StringBuffer num2, int temp, StringBuffer s, int k) { 
     while (Integer.toString(temp).length() >= k) { 
      for (int i = 0; i < num2.length(); i++) { 
       StringBuffer s1 = new StringBuffer(num2); 
       String a = s1.deleteCharAt(i).toString(); 
       int temp1 = Integer.parseInt(a); 
       if (temp > temp1) { 
        temp = Integer.parseInt(a); 
       } 
      } 
      StringBuffer ee = new StringBuffer(Integer.toString(temp)); 
      if (ee.length() >= k) { 
       smaller(temp, k); 
      } 
     } 
     return temp; 
    } 

    static void smaller(int temp, int k) { 
     StringBuffer ee = new StringBuffer(Integer.toString(temp)); 
     StringBuffer s1 = new StringBuffer(ee); 
     StringBuffer s2 = new StringBuffer(ee); 
     Integer temp1 = Integer.parseInt(s2.deleteCharAt(0).toString()); 
     compute(ee, temp1, s1, k); 
    } 
} 
+5

Java является передача по значению, так как же вы думаете, у вас есть пропуск по эталонным вопросу в Java? – Stultuske

+1

Java wont поддерживает передачу по ссылке –

+1

Можете добавить комментарии к этому коду? Сейчас очень сложно понять, что вы пытаетесь выполнить и как это происходит. В общем, хотя Java никогда не может передавать ссылки. Это всегда [pass by value] (http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value?rq=1). – mhlz

ответ

1

Бесконечный цикл вы получаете, потому что вы вызываете smaller() изнутри compute() и compute() изнутри smaller(). Если это сделано намеренно, то также добавьте условие завершения, которое предотвратит бесконечное циклирование.

+0

Он должен остановиться, когда длина нового номера меньше, чем 'k'. Итак, есть условие остановки - вопрос в том, почему он этого не достигает. – RealSkeptic

+0

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

+0

@AlokMishra для меня актуальная проблема заключается в аргументах, которые переходят из less() для compute(); – KS6

0

Вы можете использовать простой код, как показано ниже:

import java.util.Arrays; 

public class Delete3 { 

    public static void main(String[] args) { 

     int num = 246235789; 
     int numDigitRequired = 2; 

     System.out.println(getLeastNum(num, numDigitRequired)); 
    } 

    static int getLeastNum(int num, int numDigitRequired) { 

     char[] a = (num + "").toCharArray(); 

     Arrays.sort(a); 

     StringBuffer s = new StringBuffer(); 

     for (int i = 0; i < numDigitRequired; i++) 
      s.append(Character.getNumericValue(a[i])); 

     return Integer.parseInt(s.toString()); 
    } 
} 
+0

он не сработает для 24690 – KS6

+0

в случае 24690, какой результат вы ожидаете? 20 или 02? @KarthikSuresh –

+0

@AlokMishra должно быть 02 – KS6