2010-09-06 4 views
5

J'écris une fonction et je veux que deux retournent deux entiers comme résultats. Cependant, je n'arrive pas à le faire. Quelqu'un pourrait-il m'aider? Voici mon meilleur coupObtenir une fonction pour renvoyer deux entiers

public static int calc (int s, int b, int c, int d, int g) 
    { 
     if (s==g) 
      return s; 
     else if (s+b==g) 
       return s && b; 

     else if (s + c==g) 
       return s && c; 

     else if (s+d==g) 
       return s && d; 

     else 
      System.out.println("No Answer");      
    } 

Répondre

11

Vous pourriez avoir la méthode retourne un tableau de int:

public static int[] calc (int s, int b, int c, int d, int g) 
+0

Notez également que dans le « pas de réponse » cas, la méthode ** ** doit retourner un vide 'int []'. –

+0

"doit"? Ne peut-il pas retourner null ou jeter une exception? – Gabe

+0

@Gabe - vrai - mais alors pourquoi appellerait-il println? –

-4

pourquoi voulez-vous faire? et si vous avez un besoin comme ceci, vous ne pouvez pas changer votre type de retour en chaîne, car en cas de chaîne vous pouvez avoir un séparateur entre deux valeurs qui vous aidera à extraire des valeurs .... disons 10 & 30,

Je suis d'accord que c'est une mauvaise façon de résoudre ... j'ai supposé qu'il y a une limitation de coller au type de données primitif

+0

-1 abus de types d'objets. Utilisez une paire à la place – bwawok

+1

'String' serait la pire solution que je pouvais penser. Le 'Pair' et' int [] 'déjà mentionnés sont les solutions appropriées au problème OPs. –

4

Faire une petite classe interne qui a deux nombres entiers.

private static class TwoNumbers { 
    private Integer a; 
    private Integer b; 

    private TwoNumbers(Integer a, Integer b) { 
     this.a = a; 
     this.b = b; 
    } 
} 

Vous créez une instance de la classe et la renvoyez à la place.

+1

Cela ne gère pas le cas lorsque seul 's' est renvoyé. – strager

+4

strager a raison; vous devriez utiliser 'Integer' au lieu de' int' pour qu'ils puissent être NULL. – Gabe

+0

Modifié pour utiliser Integer. Vous avez tous les deux raison, j'ai raté ce cas. – Jes

5

Créez une classe "paire" et renvoyez-la.

public class Pair<T,Y> 
{ 
    public T first; 
    public Y second; 
    public Pair(T f, Y s) 
    { 
     first = f; 
     second = s; 
    } 
} 
+0

Que représentent «T» et «Y»? – Gabe

+0

'T' et' Y' sont des espaces génériques pour des types spécifiques. Dans le cas OP, ils seraient tous les deux 'Integer' –

+0

' T' signifie "type", 'V' signifie" valeur ",' E' signifie "élément", mais je n'ai aucune idée de ce que 'Y' signifie , et je ne suis pas sûr de ce que 'T' représente dans le contexte de' Y'. Sont-ils simplement des lettres choisies au hasard, ou sont-ils des mots plus longs? – Gabe

2

Pour ce problème spécifique, puisque la réponse revient toujours s:

.... 
    return s; 
.... 
    return s && b; 
.... 
    return s && c; 
.... 
    return s && d; 
.... 

vous pouvez simplement retourner la valeur 2. J'utilise 0 pour indiquer "juste s" puisque le premier cas (if (s==g)) pourrait être considéré comme if (s+0==g). Utilisez une valeur de sentinelle différente de 0 pour cela, si nécessaire.

public static int calc (int s, int b, int c, int d, int g) 
{ 
    if (s==g) 
     return 0; 
    else if (s+b==g) 
      return b; 
    else if (s+c==g) 
      return c; 
    else if (s+d==g) 
      return d; 
    else { 
     // System.out.println("No Answer"); 

     // Probably better to throw or return a sentinel value of 
     // some type rather than print to screen. Which way 
     // probably depends on whether "no answer" is a normal 
     // possible condition. 
     throw new IndexOutOfBoundsException("No Answer"); 
    } 
} 

Si aucune exception est levée, alors s est toujours le premier résultat:

try { 
    int result1 = s; 
    int result2 = calc(s, b, c, d, g); 
} catch (IndexOutOfBoundsException ex) { 
    System.out.println("No Answer"); 
}