Java 메서드에서 2개의 값을 반환하려면 어떻게 해야 합니까?
Java 메서드에서 2개의 값을 반환하려고 하는데 이러한 오류가 발생합니다.코드는 다음과 같습니다.
// Method code
public static int something(){
int number1 = 1;
int number2 = 2;
return number1, number2;
}
// Main method code
public static void main(String[] args) {
something();
System.out.println(number1 + number2);
}
오류:
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - missing return statement
at assignment.Main.something(Main.java:86)
at assignment.Main.main(Main.java:53)
Java 결과: 1
두 값이 포함된 배열을 반환하거나 일반 배열을 사용하는 대신Pair
반환할 결과를 나타내는 클래스를 만들고 해당 클래스의 인스턴스를 반환합니다.클래스에 의미 있는 이름을 지정합니다.어레이를 사용하는 것보다 이 접근방식의 장점은 타입의 안전성입니다.이것에 의해, 프로그램을 이해하기 쉬워집니다.
주의: 범용Pair
class는 여기의 다른 답변 중 일부에서 제안된 바와 같이 유형 안전성을 제공하지만 결과가 무엇을 나타내는지는 전달하지 않습니다.
예(실제로 의미 있는 이름을 사용하지 않음):
final class MyResult {
private final int first;
private final int second;
public MyResult(int first, int second) {
this.first = first;
this.second = second;
}
public int getFirst() {
return first;
}
public int getSecond() {
return second;
}
}
// ...
public static MyResult something() {
int number1 = 1;
int number2 = 2;
return new MyResult(number1, number2);
}
public static void main(String[] args) {
MyResult result = something();
System.out.println(result.getFirst() + result.getSecond());
}
Java는 다중 값 반환을 지원하지 않습니다.값의 배열을 반환합니다.
// Function code
public static int[] something(){
int number1 = 1;
int number2 = 2;
return new int[] {number1, number2};
}
// Main class code
public static void main(String[] args) {
int result[] = something();
System.out.println(result[0] + result[1]);
}
일반적인 기능을 구현할 수 있습니다.Pair
다음 두 가지 값만 반환하면 됩니다.
public class Pair<U, V> {
/**
* The first element of this <code>Pair</code>
*/
private U first;
/**
* The second element of this <code>Pair</code>
*/
private V second;
/**
* Constructs a new <code>Pair</code> with the given values.
*
* @param first the first element
* @param second the second element
*/
public Pair(U first, V second) {
this.first = first;
this.second = second;
}
//getter for first and second
그런 다음 메서드에서 다음과 같이 반환하도록 합니다.Pair
:
public Pair<Object, Object> getSomePair();
Java에서 반환할 수 있는 값은 1개뿐이므로 가장 깔끔한 방법은 다음과 같습니다.
return new Pair<Integer>(number1, number2);
다음은 업데이트된 코드 버전입니다.
public class Scratch
{
// Function code
public static Pair<Integer> something() {
int number1 = 1;
int number2 = 2;
return new Pair<Integer>(number1, number2);
}
// Main class code
public static void main(String[] args) {
Pair<Integer> pair = something();
System.out.println(pair.first() + pair.second());
}
}
class Pair<T> {
private final T m_first;
private final T m_second;
public Pair(T first, T second) {
m_first = first;
m_second = second;
}
public T first() {
return m_first;
}
public T second() {
return m_second;
}
}
다음은 SimpleEntry를 사용한 매우 간단한 솔루션입니다.
AbstractMap.Entry<String, Float> myTwoCents=new AbstractMap.SimpleEntry<>("maximum possible performance reached" , 99.9f);
String question=myTwoCents.getKey();
Float answer=myTwoCents.getValue();
Java 내장 함수만 사용하며 타입 safty의 이점이 있습니다.
Pair/Tuple type 객체를 사용하면 Apache commons-lang에 의존할 경우 객체를 생성할 필요도 없습니다.Pair 클래스를 사용합니다.
컬렉션을 사용하여 둘 이상의 반환 값을 반환해야 합니다.
당신의 경우 코드를 다음과 같이 씁니다.
public static List something(){
List<Integer> list = new ArrayList<Integer>();
int number1 = 1;
int number2 = 2;
list.add(number1);
list.add(number2);
return list;
}
// Main class code
public static void main(String[] args) {
something();
List<Integer> numList = something();
}
public class Mulretun
{
public String name;;
public String location;
public String[] getExample()
{
String ar[] = new String[2];
ar[0]="siva";
ar[1]="dallas";
return ar; //returning two values at once
}
public static void main(String[] args)
{
Mulretun m=new Mulretun();
String ar[] =m.getExample();
int i;
for(i=0;i<ar.length;i++)
System.out.println("return values are: " + ar[i]);
}
}
o/p:
return values are: siva
return values are: dallas
왜 아무도 더 우아한 콜백 솔루션을 내놓지 않았는지 궁금합니다.따라서 반환 유형을 사용하는 대신 메서드에 전달된 핸들러를 인수로 사용합니다.다음 예에서는 두 가지 대조적인 접근 방식을 보여 줍니다.둘 중 어느 쪽이 더 우아한지 알고 있습니다. :-)
public class DiceExample {
public interface Pair<T1, T2> {
T1 getLeft();
T2 getRight();
}
private Pair<Integer, Integer> rollDiceWithReturnType() {
double dice1 = (Math.random() * 6);
double dice2 = (Math.random() * 6);
return new Pair<Integer, Integer>() {
@Override
public Integer getLeft() {
return (int) Math.ceil(dice1);
}
@Override
public Integer getRight() {
return (int) Math.ceil(dice2);
}
};
}
@FunctionalInterface
public interface ResultHandler {
void handleDice(int ceil, int ceil2);
}
private void rollDiceWithResultHandler(ResultHandler resultHandler) {
double dice1 = (Math.random() * 6);
double dice2 = (Math.random() * 6);
resultHandler.handleDice((int) Math.ceil(dice1), (int) Math.ceil(dice2));
}
public static void main(String[] args) {
DiceExample object = new DiceExample();
Pair<Integer, Integer> result = object.rollDiceWithReturnType();
System.out.println("Dice 1: " + result.getLeft());
System.out.println("Dice 2: " + result.getRight());
object.rollDiceWithResultHandler((dice1, dice2) -> {
System.out.println("Dice 1: " + dice1);
System.out.println("Dice 2: " + dice2);
});
}
}
두 개의 다른 값을 반환하기 위해 고유한 클래스를 만들 필요는 없습니다.HashMap을 다음과 같이 사용합니다.
private HashMap<Toy, GameLevel> getToyAndLevelOfSpatial(Spatial spatial)
{
Toy toyWithSpatial = firstValue;
GameLevel levelToyFound = secondValue;
HashMap<Toy,GameLevel> hm=new HashMap<>();
hm.put(toyWithSpatial, levelToyFound);
return hm;
}
private void findStuff()
{
HashMap<Toy, GameLevel> hm = getToyAndLevelOfSpatial(spatial);
Toy firstValue = hm.keySet().iterator().next();
GameLevel secondValue = hm.get(firstValue);
}
타입 세이프티라는 장점도 있습니다.
내 생각에 가장 좋은 것은 새로운 클래스를 만드는 것이다. 예를 들어 다음과 같다.
public class pairReturn{
//name your parameters:
public int sth1;
public double sth2;
public pairReturn(int param){
//place the code of your function, e.g.:
sth1=param*5;
sth2=param*10;
}
}
그런 다음 다음 함수를 사용하는 것처럼 생성자를 사용합니다.
pairReturn pR = new pairReturn(15);
pR.sth1, pR.sth2를 "함수의 2가지 결과"로 사용할 수 있습니다.
개체 배열 반환
private static Object[] f ()
{
double x =1.0;
int y= 2 ;
return new Object[]{Double.valueOf(x),Integer.valueOf(y)};
}
파라미터로 가변 객체를 송신할 수도 있습니다.이러한 오브젝트를 수정하는 방법을 사용하면 함수에서 돌아오면 오브젝트가 수정됩니다.불변이기 때문에 Float 같은 것에서는 동작하지 않습니다.
public class HelloWorld{
public static void main(String []args){
HelloWorld world = new HelloWorld();
world.run();
}
private class Dog
{
private String name;
public void setName(String s)
{
name = s;
}
public String getName() { return name;}
public Dog(String name)
{
setName(name);
}
}
public void run()
{
Dog newDog = new Dog("John");
nameThatDog(newDog);
System.out.println(newDog.getName());
}
public void nameThatDog(Dog dog)
{
dog.setName("Rutger");
}
}
그 결과: Rutger
첫째, Java에 여러 값을 반환하기 위한 튜플이 있으면 더 좋습니다.
번째,한 한 간단한 , 코드화Pair
.class를 합니다.
그러나 쌍을 반환해야 하는 경우에는 필드 이름부터 시작하여 클래스 이름까지 어떤 개념을 나타내는지, 필드 이름이 생각보다 큰 역할을 하는지, 전체 설계에 명확한 추상화가 필요한지 고려하십시오.아마...code hint
주의사항:독단적으로 도움이 될 거라고 말하는 게 아니라, 그냥 보기 위해서, 그게 도움이 될 지 보려고...그렇지 않다면요.
언급URL : https://stackoverflow.com/questions/2832472/how-to-return-2-values-from-a-java-method
'programing' 카테고리의 다른 글
오류:java: 비활성 소스 릴리스: Intellij의 8.그것은 무엇을 뜻하나요? (0) | 2022.07.10 |
---|---|
readelf와 같은 툴을 Mac OS X용으로 제공합니까? (0) | 2022.07.10 |
Vue.js는 화면상의 현재 메시지 포스처를 변경하지 않고 이전 채팅메시지를 렌더링합니다. (0) | 2022.07.10 |
SVN "이미 잠긴 오류" (0) | 2021.01.19 |
Maven 프로젝트에서 -Xlint : unchecked를 사용하여 컴파일하는 방법은 무엇입니까? (0) | 2021.01.19 |