কিভাবে একটি জাভা পদ্ধতি থেকে 2 মান ফিরে?


179

আমি একটি জাভা পদ্ধতি থেকে 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)

জাভা ফলাফল: 1


1
সেই অনুলিপিটি কি অন্য পথে যেতে হবে? উত্তরটি এখানে আরও ভাল বলে মনে হচ্ছে।
জে রিচার্ড স্নেপ

উত্তর:


239

দুটি মান রয়েছে এমন একটি অ্যারে ফিরিয়ে দেওয়া বা জেনেরিক Pairক্লাস ব্যবহার করার পরিবর্তে, এমন একটি শ্রেণি তৈরি করা বিবেচনা করুন যা আপনি যে ফলাফলটি ফিরে আসতে চান তা উপস্থাপন করে এবং সেই শ্রেণীর উদাহরণটি ফিরে আসে। শ্রেণীর অর্থপূর্ণ নাম দিন। অ্যারে ব্যবহার করে এই পদ্ধতির সুবিধাগুলি হ'ল টাইপ সুরক্ষা এবং এটি আপনার প্রোগ্রামটিকে বুঝতে আরও সহজ করে তুলবে।

দ্রষ্টব্য: একটি জেনেরিক Pairশ্রেণি, যেমন এখানে অন্যান্য উত্তরগুলির কয়েকটিতে প্রস্তাবিত, আপনাকে টাইপ সুরক্ষা দেয় তবে ফলাফলটি কী উপস্থাপন করে তা প্রকাশ করে না।

উদাহরণ (যা সত্যিকারের অর্থপূর্ণ নাম ব্যবহার করে না):

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());
}

1
এটি আমার পছন্দসই রুট হবে - সম্ভবত সংখ্যার জোড়ার কিছু অর্থ রয়েছে এবং যদি ফিরতি টাইপটি এটি উপস্থাপন করে তবে এটি ভাল হবে।
আরমান্ড

3
আপনি java.util.AbstractMap.SimpleEntry থেকে সিম্পল এন্ট্রি <টাইপ_ফ_ভ্যালু_1, টাইপ_ফ_ভ্যালু_2> ব্যবহার করতে পারেন এবং বস্তু 2 পেতে getKey () ব্যবহার করতে পারেন 2
ক্রিস্টালোনিক্স

45
আমি খুব দৃ strongly়ভাবে অনুভব করছি যে জাভা আপনাকে একাধিক মান ফেরত দেওয়ার অনুমতি দেবে। এটি দ্রুততর হবে (কিছু কম বস্তু তৈরি হয়েছে) এবং আপনি যখন কিছুটা আলাদা করতে চান প্রতিবার অতিরিক্ত ক্লাসের (ফোলা কোড) লাগবে না। আমি কোনও ডাউনস্টাইড দেখছি না, সম্ভবত কেউ আমাকে আলোকিত করতে পারে?
ক্রিস সাইলিন

এটি কেবল জিজ্ঞাসিত প্রশ্নের জন্য কাজ, যা এখনও পাইথনের মতো "পদ্ধতি থেকে কীভাবে 2 টি মানকে ফিরিয়ে আনতে পারে" stands
আনম শেরাজ

4
@ আনমশেরাজ "কীভাবে পাইথনের মতো ... কীভাবে" এর উত্তর: আপনি না, কারণ জাভাতে এমন ভাষার বৈশিষ্ট্য নেই ...
জেস্পার

74

জাভা মাল্টি-মান রিটার্ন সমর্থন করে না। মানগুলির একটি অ্যারে ফিরিয়ে দিন।

// 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]);
}

7
এটি প্রায়শই সর্বদা ভুল জিনিস, বিশেষত যদি দুটি ফলাফলের মানের ধরণ আলাদা হয়।
কেভিন সিতজে

7
@ বারাকিভা, এটির ভুল হওয়ার কারণটি হ'ল আপনার টাইপ সুরক্ষা। আপনি যদি একজাতীয় ধরণের মানগুলি ফিরিয়ে দিচ্ছেন তবে আপনার সর্বদা একটি অ্যারের উপরে একটি তালিকা পছন্দ করা উচিত। বিশেষত, আপনি যদি জেনেরিক মান নিয়ে কাজ করে থাকেন তবে একটি তালিকার <T> সর্বদা টির চেয়ে বেশি একটি রিটার্ন মান হিসাবে পছন্দ করা হয় [কারণ আপনি সর্বদা জেনেরিক ধরণের উপর একটি তালিকা তৈরি করতে পারেন তবে কখনও অ্যারে নয়; আপনি এটি করতে পারবেন না: "নতুন টি [দৈর্ঘ্য];" পৃথক প্রকারের জন্য এখানে নির্দেশিত হিসাবে জোড় শ্রেণি তৈরির পদ্ধতির বিষয়টি ভিন্নজাতীয় ধরণের জন্য ভাল বিকল্প।
কেভিন সিতজে

41

আপনি জেনেরিক বাস্তবায়ন করতে 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();

এই পদ্ধতির ফিরতি কেমন হবে?
Jwan622

এর লাইনে কিছু: জোড় = নতুন জুড়ি (জিনিস 1, জিনিস 2) .... রিটার্ন জুড়ি;
লার্স অ্যান্ডরেন

27

আপনি জাভাতে কেবল একটি মান ফিরিয়ে দিতে পারেন, তাই নিকটতম উপায়টি এরকম:

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;
    }
}

8

সিম্পল এন্ট্রি সহ সত্যিই সহজ এবং সংক্ষিপ্ত সমাধান এখানে:

AbstractMap.Entry<String, Float> myTwoCents=new AbstractMap.SimpleEntry<>("maximum possible performance reached" , 99.9f);

String question=myTwoCents.getKey();
Float answer=myTwoCents.getValue();

শুধুমাত্র ফাংশনে অন্তর্নিহিত জাভা ব্যবহার করে এটি নিরাপদ সুবিধার প্রকারে আসে।


6

একাধিক রিটার্ন মান প্রদান করতে আপনাকে সংগ্রহগুলি ব্যবহার করতে হবে

আপনার ক্ষেত্রে আপনি আপনার কোড হিসাবে লিখুন

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();
    }

4
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

4

একটি জুড়ি / টুপল টাইপ অবজেক্ট ব্যবহার করুন, আপনি যদি অ্যাপাচি কমন্স-ল্যাংয়ের উপর নির্ভর করেন তবে আপনাকে একটি তৈরি করতে হবে না। কেবল পেয়ার ক্লাসটি ব্যবহার করুন ।


কেন এই আরও upvated হয় না?
রুনি লিলিমেটস

3

আমি কেন আগ্রহী যে কেউ কেন আরও মার্জিত কলব্যাক সমাধান নিয়ে আসে নি। সুতরাং কোনও রিটার্ন টাইপ ব্যবহার না করে আপনি একটি হ্যান্ডলারটি পদ্ধতিতে পাস করে যুক্তি হিসাবে ব্যবহার করেন। নীচের উদাহরণটিতে দুটি বিপরীত পদ্ধতি রয়েছে। আমি জানি দুজনের মধ্যে কোনটি আমার কাছে বেশি মার্জিত। :-)

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);
        });
    }
}

2

দুটি পৃথক মান প্রদান করতে আপনাকে নিজের শ্রেণি তৈরি করার দরকার নেই। কেবল এটির মতো একটি হ্যাশম্যাপ ব্যবহার করুন:

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);
}

এমনকি আপনার প্রকারের সুরক্ষার সুবিধাও রয়েছে।


2
আপনার এমনকি হ্যাশম্যাপের দরকার নেই, কেবল একটি সিম্পল এন্ট্রি ব্যবহার করুন!
জেরাস

কেন একটি হ্যাশম্যাপ, আমি জিজ্ঞাসা করতে পারি? এখানে ব্যবহার করার জন্য এটি একটি অদ্ভুত ডেটা কাঠামোর মতো বলে মনে হচ্ছে।
নীল চৌধুরী

@ নীল চৌধুরী আর কোনও কারণ নেই কারণ এটি একটি সুবিধামতো বিল্ট-ইন ক্লাস হিসাবে দুটি নির্দিষ্ট পরামিতি গ্রহণ করে। জেরাস যেমন উল্লেখ করেছেন, অ্যাবস্ট্রাক্টম্যাপ.সিম্পেলএন্ট্রি এখানে আরও বেশি লাইটওয়েটের বিকল্প। নীচে সম্পর্কিত উত্তর দেখুন দয়া করে!
কোড নিননেটাইনাইনপয়েন্টাইন

2

আমার মতে সেরাটি একটি নতুন ক্লাস তৈরি করা যা কোন কনস্ট্রাক্টর আপনার প্রয়োজনীয় ফাংশনটি যেমন:

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);

এবং আপনি "ফাংশনের 2 ফলাফল" হিসাবে pR.sth1, pR.sth2 ব্যবহার করতে পারেন


1

আপনি প্যারামিটার হিসাবে পরিবর্তনীয় অবজেক্টগুলিতে প্রেরণ করতে পারেন, আপনি যদি এগুলি সংশোধন করার জন্য পদ্ধতি ব্যবহার করেন তবে ফাংশন থেকে ফিরে আসার পরে সেগুলি পরিবর্তন করা হবে। এটি ফ্লোটের মতো স্টাফগুলিতে কাজ করবে না, কারণ এটি পরিবর্তনযোগ্য imm

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");
     }
}

ফলাফল: রাটার


1

অবজেক্টগুলির একটি অ্যারে ফেরত দিন

private static Object[] f () 
{ 
     double x =1.0;  
     int y= 2 ;
     return new Object[]{Double.valueOf(x),Integer.valueOf(y)};  
}

0

প্রথমত, জাভাতে একাধিক মান ফেরত দেওয়ার জন্য টিপলস থাকলে এটি আরও ভাল।

দ্বিতীয়ত, সম্ভবতম Pairশ্রেণীর কোড দিন বা একটি অ্যারে ব্যবহার করুন।

কিন্তু, যদি আপনি না একজোড়া ফিরে যাওয়ার প্রয়োজন নেই, বিবেচনা কি ধারণা এটা প্রতিনিধিত্ব করে (তার ফিল্ডের নাম দিয়ে শুরু, তারপর বর্গ নাম) - এবং তা একটি বৃহত্তর ভূমিকা চেয়ে চিন্তা খেলে, এবং একটি আছে আপনার সামগ্রিক নকশা যদি এটা সাহায্য করবে এটির জন্য সুস্পষ্ট বিমূর্ততা। সম্ভবত এটি একটি code hint...
দয়া করে দ্রষ্টব্য: আমি কৌতুকপূর্ণভাবে বলছি না যে এটি সাহায্য করবে , তবে কেবল এটি দেখুন কিনা তা দেখার জন্য ... বা যদি তা না করে তবে।


-7

এবং এই কিভাবে আপনি এটা জাতীয় না হয়: return { objA, valueB }। আমি জানি এটি অফটোপিক, তবে জাভাতে কীভাবে পুরো নতুন ক্লাস প্রয়োগ করতে হবে তা দেখার পরে আমি এই মন্তব্যটি করা থেকে বিরত থাকতে পারি না। জাভাস্ক্রিপ্ট - আপনার জীবন অপচয় করা বন্ধ করুন এবং স্ক্রিপ্টিং শুরু করুন!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.