কিভাবে জাভাতে int [] পূর্ণসংখ্যা [] তে রূপান্তর করবেন?


167

আমি জাভাতে নতুন এবং খুব বিভ্রান্ত।

আমার দৈর্ঘ্য 4 এর একটি বড় ডেটাসেট রয়েছে int[]এবং আমি 4 টি সংখ্যার প্রতিটি নির্দিষ্ট সংমিশ্রণ ঘটে তার সংখ্যাটি গণনা করতে চাই। এটি কোনও নথিতে শব্দের ফ্রিকোয়েন্সি গণনা করার সাথে খুব মিল।

Map<int[], double>তালিকাটি পুনরাবৃত্তি হওয়ার সাথে সাথে আমি প্রতিটি ইনট [মানচিত্রের] একটি চলমান গণিতে মানচিত্র তৈরি করতে চাই , তবে মানচিত্র আদিম ধরণের গ্রহণ করে না।

তাই আমি তৈরি Map<Integer[], Double>

আমার ডেটা একটি হিসাবে সংরক্ষণ করা হয় ArrayList<int[]>যাতে আমার লুপটি এমন কিছু হওয়া উচিত

ArrayList<int[]> data = ... // load a dataset`

Map<Integer[], Double> frequencies = new HashMap<Integer[], Double>();

for(int[] q : data) {

    // **DO SOMETHING TO convert q from int[] to Integer[] so I can put it in the map

    if(frequencies.containsKey(q)) {
    frequencies.put(q, tfs.get(q) + p);
    } else {
        frequencies.put(q, p);
    }
}

আমি নিশ্চিত কি কোড আমি মন্তব্য প্রয়োজন এই কাজ একটি রূপান্তর করতে না করতে আছি int[]একটি থেকে Integer[]। অথবা হতে পারে আমি এটি করার সঠিক উপায় সম্পর্কে মৌলিকভাবে বিভ্রান্ত।


6
"আমি একটি মানচিত্র <int [], ডাবল> তৈরি করতে চাই ... তবে মানচিত্র আদিম ধরণের গ্রহণ করে না।" নীচের পোস্টগুলির মধ্যে একটিতে যেমন উল্লেখ করা হয়েছে, অন্ত: [] কোনও প্রাথমিক ধরনের নয়, তাই এটি আসল সমস্যা নয়। আসল সমস্যাটি হ'ল অ্যারে উপাদানগুলির তুলনা করার জন্য .aquals () কে ওভাররাইড করে না। সেই অর্থে পূর্ণসংখ্যায় রূপান্তর করা [] (যেমন আপনার শিরোনামটি বলেছে) আপনাকে সাহায্য করবে না। উপরের কোডে, ফ্রিকোয়েন্সি। কনটেনসকি (কিউ) এখনও আপনার প্রত্যাশার মতো কাজ করবে না কারণ এটি তুলনা করার জন্য .equals () ব্যবহার করে। আসল সমাধানটি এখানে অ্যারে ব্যবহার না করা।
newacct

অন্য উত্তরের সাথে স্প্যাম করতে চাই না, তবে এটি সম্পর্কে এখন একটি ডকুমেন্টেশনের উদাহরণ রয়েছে not
মুরিনিক

উত্তর:


189

নেটিভ জাভা 8 (একটি লাইন)

জাভা 8 এর int[]সাহায্যে Integer[]সহজে রূপান্তর করা যায়:

int[] data = {1,2,3,4,5,6,7,8,9,10};

// To boxed array
Integer[] what = Arrays.stream( data ).boxed().toArray( Integer[]::new );
Integer[] ever = IntStream.of( data ).boxed().toArray( Integer[]::new );

// To boxed list
List<Integer> you  = Arrays.stream( data ).boxed().collect( Collectors.toList() );
List<Integer> like = IntStream.of( data ).boxed().collect( Collectors.toList() );

অন্যরা যেমন বলেছে, Integer[]সাধারণত কোনও ভাল মানচিত্র কী নয়। তবে রূপান্তর যতদূর যায়, এখন আমাদের তুলনামূলকভাবে পরিষ্কার এবং নেটিভ কোড রয়েছে।


3
এরই মধ্যে সঠিক উপায়। আপনার যদি ইন্টিজার-অ্যারে তালিকা হিসাবে প্রয়োজন হয় তবে আপনি লিখতে পারেন:List<Integer> list = IntStream.of(q).boxed().collect(Collectors.toList());
-এ ভাবুন

একটিতে রূপান্তর করতে Integer[]আমি আসলে নিম্নলিখিত সিনট্যাক্সটি ব্যবহার করার পরামর্শ দেব: Integer[] boxed = IntStream.of(unboxed).boxed().toArray();@NwDx এর অনুরূপ ফ্যাশনে
YoYo

1
@JoD। হ্যাঁ, এটি কাজ করে। তবে যাইহোক IntStream.ofকল Arrays.stream। আমি এটি ব্যক্তিগত পছন্দ নেমে আসে বলে মনে করি - আমি একটি ওভাররাইড ফাংশন পছন্দ করি, কিছু আরও স্পষ্ট ক্লাস ব্যবহার করে ভালবাসে।
শেপি

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

1
@ বিজয়চাভিদা নতুন সিনট্যাক্স, যাকে মেথড রেফারেন্স বলা হয়, 2014 সালে জাভা 8 দিয়ে ল্যাম্বডা ( জেএসআর 335 পার্ট সি ) এর অংশ হিসাবে চালু হয়েছিল । এর অর্থ the "new" method (constructor) of the Integer[] class
শেপি

79

আপনি যদি কোনওটিকে একটিতে রূপান্তর করতে চান তবে এটি জেডিকে int[]করার Integer[]কোনও স্বয়ংক্রিয় উপায় নেই। তবে আপনি এই জাতীয় কিছু করতে পারেন:

int[] oldArray;

... // Here you would assign and fill oldArray

Integer[] newArray = new Integer[oldArray.length];
int i = 0;
for (int value : oldArray) {
    newArray[i++] = Integer.valueOf(value);
}

যদি আপনার অ্যাপাচি ল্যাং লাইব্রেরিতে অ্যাক্সেস থাকে তবে আপনি ArrayUtils.toObject(int[])এই পদ্ধতিটি ব্যবহার করতে পারেন :

Integer[] newArray = ArrayUtils.toObject(oldArray);

71
লুপের জন্য করণীয় করার একটি বাজে উপায়।
জেমস বেকওয়ার

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

18
@ দাহাকা, valueইনডেক্সিং ভেরিয়েবল যখন রয়েছে তখন এটির পুনরাবৃত্তি ব্যবহার করতে বাড়াতে iহবে।
lcn

1
@ আইকন, আমি দেখতে পাচ্ছি যে কিছু লোক কেন এই স্টাইলটিকে পছন্দ করেন না, তবে এটিকে বাজে হিসাবে এত অনাকাঙ্ক্ষিত করে তোলে কী?
এডি

14
@ আইএনএন, @ দাহাকা: উদাসীনতা হ'ল যেহেতু আপনি ইতিমধ্যে একটি ইনক্রিমেন্টিং ইনডেক্স ভেরিয়েবল ব্যবহার করছেন, তাই প্রত্যেকের জন্য একটিও ব্যবহার করার দরকার নেই; যদিও কোডটিতে এটি বেশ সুন্দর এবং সাধারণ দেখাচ্ছে, এরপরে অপ্রয়োজনীয় ওভারহেড জড়িত scenes একটি traditional for (int i...)তিহ্যগত লুপ এখানে আরও দক্ষ হবে be
ডাইসকোগ

8

সম্ভবত আপনি অ্যারের পরিচয়ের পরিবর্তে উপাদানগুলির মানের সাথে মানচিত্রের চাবিটি চান। সেক্ষেত্রে আপনি এমন এক ধরণের অবজেক্ট চান যা সংজ্ঞা দেয় equalsএবং hashCodeযেমনটি আপনি প্রত্যাশা করতেন। সবচেয়ে সহজ হ'ল একটিতে রূপান্তর করা List<Integer>, হয় হয় একটি ArrayListবা আরও ভাল ব্যবহার Arrays.asList। এর চেয়ে ভাল আপনি ডেটা উপস্থাপন করে এমন একটি ক্লাসের সাথে পরিচয় করিয়ে দিতে পারেন (এর মতো java.awt.Rectangleতবে আমি ভেরিয়েবলগুলি প্রাইভেট ফাইনাল করার প্রস্তাব দিই, এবং ক্লাস ফাইনালও)।


: ওহ, এখানে একটি অ্যারে রূপান্তর প্রশ্ন প্রায় শুধু অন্যান্য উপায় stackoverflow.com/questions/564392/...
টম Hawtin - tackline

8

বাহ্যিক লাইব্রেরি ছাড়াই নিয়মিত ফর লুপ ব্যবহার করা:

পূর্ণ রূপান্তর করুন [] পূর্ণসংখ্যা থেকে []:

int[] primitiveArray = {1, 2, 3, 4, 5};
Integer[] objectArray = new Integer[primitiveArray.length];

for(int ctr = 0; ctr < primitiveArray.length; ctr++) {
    objectArray[ctr] = Integer.valueOf(primitiveArray[ctr]); // returns Integer value
}

পূর্ণসংখ্যার রূপান্তর করুন [] ইনট ইন []:

Integer[] objectArray = {1, 2, 3, 4, 5};
int[] primitiveArray = new int[objectArray.length];

for(int ctr = 0; ctr < objectArray.length; ctr++) {
    primitiveArray[ctr] = objectArray[ctr].intValue(); // returns int value
}

6

আগের উত্তরে আমি ভুল ছিলাম। যথাযথ সমাধান হ'ল মানচিত্রের আসল মান [] মোড়কে এই শ্রেণিকে একটি কী হিসাবে ব্যবহার করা।

public class IntArrayWrapper {
        int[] data;

        public IntArrayWrapper(int[] data) {
            this.data = data;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;

            IntArrayWrapper that = (IntArrayWrapper) o;

            if (!Arrays.equals(data, that.data)) return false;

            return true;
        }

        @Override
        public int hashCode() {
            return data != null ? Arrays.hashCode(data) : 0;
        }
    }

এবং এইভাবে আপনার কোড পরিবর্তন করুন:

   Map<IntArrayWrapper, Double > freqs = new HashMap<IntArrayWrapper, Double>();

    for (int[] data : datas) {
        IntArrayWrapper wrapper = new IntArrayWrapper(data);

        if ( freqs.containsKey(wrapper)) {
            freqs.put(wrapper, freqs.get(wrapper) + p);
        }

        freqs.put(wrapper, p);
    }

1
আমি ক্লাস ফাইনাল করব, এবং ফিল্ডটি প্রাইভেট ফাইনাল করব। কনস্ট্রাক্টরে অ্যারের একটি ডিফেন্সিভ কপি তৈরি করুন (ক্লোন)) এবং ঠিক বিবরণী যদি অদ্ভুত না হয়ে Arrays.equals থেকে মানটি ফিরিয়ে দিন। toString সুন্দর হবে।
টম হাটিন -

1
ওহ এবং নাল ডেটার জন্য কনস্ট্রাক্টর (সম্ভবত কলিং ক্লোন) থেকে একটি এনপিই নিক্ষেপ করুন, এবং হ্যাশকোডে চেক নেই।
টম হাটিন -

সত্য .. তবে সমানগুলির জন্য কোডটি হ্যাশকোড আইডিইএ :-) দ্বারা উত্পাদিত হয়েছে। এটি সঠিকভাবে কাজ করে।
মিহাই টুডার

6
  1. পূর্ণ রূপান্তর করুন [] পূর্ণসংখ্যা থেকে []

    public static Integer[] toConvertInteger(int[] ids) {
    
      Integer[] newArray = new Integer[ids.length];
         for (int i = 0; i < ids.length; i++) {
           newArray[i] = Integer.valueOf(ids[i]);
         }
       return newArray;
    }
  2. পূর্ণসংখ্যা রূপান্তর করুন [] ইনট ইন []

    public static int[] toint(Integer[] WrapperArray) {
    
       int[] newArray = new int[WrapperArray.length];
          for (int i = 0; i < WrapperArray.length; i++) {
             newArray[i] = WrapperArray[i].intValue();
          }
       return newArray;
    }

2
এটি অটোবক্সিংয়ের কারণে বরং ভুল। 1 ম উদাহরণে আপনি সহজভাবে করতে পারেন newArray[i] = ids[i];এবং দ্বিতীয়টিতে newArray[i] = WrapperArray[i]:)
Eel Lee

3

আপনার নিজের কোডটি লেখার পরিবর্তে আপনি কোনও ইন্টিজার অ্যারেতে অনুলিপি না করে বিদ্যমান ইনট [বাছুর] জন্য একটি ইনবুফার ব্যবহার করতে পারেন

int[] a = {1,2,3,4};
IntBuffer b = IntBuffer.wrap(a);

ইন্টবুফার তুলনামূলক কার্যকর করে যাতে আপনি ইতিমধ্যে লিখেছেন কোডটি ব্যবহার করতে সক্ষম হন। সাধারণত মানচিত্রগুলি কীগুলির তুলনা করে যে a.equals (খ) দুটি কী সমান বলে বলতে ব্যবহৃত হয়, সুতরাং অ্যারে 1,2,3 সহ দুটি ইন্টারবফার - অ্যারেগুলি বিভিন্ন মেমরির স্থানে থাকলেও - সমান এবং তাই হবে বলেও জানানো হয় আপনার ফ্রিকোয়েন্সি কোড জন্য কাজ।

ArrayList<int[]> data = ... // load a dataset`

Map<IntBuffer, Double> frequencies = new HashMap<IntBuffer, Double>();

for(int[] a : data) {

    IntBuffer q = IntBuffer.wrap(a);

    if(frequencies.containsKey(q)) {
        frequencies.put(q, tfs.get(q) + p);
    } else {
        frequencies.put(q, p);
    }

}

আশা করি এইটি কাজ করবে


2

আপনার মানচিত্রে কেন আপনার দ্বিগুণ প্রয়োজন তা নিশ্চিত নন। আপনি যা করার চেষ্টা করছেন তার নিরিখে, আপনার একটি ইনট রয়েছে [] এবং আপনি কেবল প্রতিটি ক্রমটি কতবার ঘটে তার একটি সংখ্যা চান? কেন এটি যাইহোক, একটি ডাবল প্রয়োজন?

আমি যা করব তা হ'ল একটি সঠিক .equals এবং .hashCode পদ্ধতি সহ ইনট অ্যারের জন্য একটি র‌্যাপার তৈরি করা যা খাঁটি [] অবজেক্ট নিজেই এই পদ্ধতির সংস্করণে ডেটা বিবেচনা করে না এই জন্য অ্যাকাউন্টে account

public class IntArrayWrapper {
    private int values[];

    public IntArrayWrapper(int[] values) {
        super();
        this.values = values;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + Arrays.hashCode(values);
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        IntArrayWrapper other = (IntArrayWrapper) obj;
        if (!Arrays.equals(values, other.values))
            return false;
        return true;
    }

}

এবং তারপরে গুগল পেয়ারার মাল্টিসাইট ব্যবহার করুন, যা হ'ল ঘটনা গণনা করার উদ্দেশ্যে বোঝানো হয়, যতক্ষণ না আপনি এ্যালেন্ট টাইপটি রেখেছেন ততক্ষণ সঠিক .equals এবং .hashCode পদ্ধতি রয়েছে।

List<int[]> list = ...;
HashMultiset<IntArrayWrapper> multiset = HashMultiset.create();
for (int values[] : list) {
    multiset.add(new IntArrayWrapper(values));
}

তারপরে, কোনও নির্দিষ্ট সংমিশ্রণের জন্য গণনা পেতে:

int cnt = multiset.count(new IntArrayWrapper(new int[] { 0, 1, 2, 3 }));

এটি IntArrayWrapperঅবশ্যই int[]হ্যাশ কী হিসাবে অ্যারে ব্যবহার করার জন্য সঠিক পন্থা , তবে এটি উল্লেখ করা উচিত যে এই জাতীয় ধরণ ইতিমধ্যে বিদ্যমান ... আপনি এটি অ্যারে মোড়ানোর জন্য ব্যবহার করতে পারেন এবং এটি কেবল hashCodeএবং equalsএটি তুলনীয়ও নয় ble
হোলার

2

আপডেট: নীচের সংকলন করা হলেও এটি ArrayStoreExceptionরানটাইমের সময় একটি ছুড়ে ফেলে । খুব খারাপ. আমি এটি ভবিষ্যতের রেফারেন্সের জন্য থাকতে দেব।


রূপান্তর একটি int[], একটি থেকে Integer[]:

int[] old;
...
Integer[] arr = new Integer[old.length];
System.arraycopy(old, 0, arr, 0, old.length);

আমাকে অবশ্যই স্বীকার করতে হবে যে আমি এই সংকলনগুলি কিছুটা অবাক করেছিলাম System.arraycopy সংকলনগুলি নিম্ন স্তরের এবং সমস্ত কিছু হচ্ছে, কিন্তু তা করে। কমপক্ষে জাভা in এ।

আপনি ঠিক অন্য কোনও উপায়ে রূপান্তর করতে পারেন।


2
এই উত্তরটি যখন কাজ করে না তখন "রেফারেন্সের জন্য" রাখার ক্ষেত্রে আমি খুব বেশি মূল্য দেখি না। এমনকি System.arraycopy () এর জন্য ডকুমেন্টেশন এমনকি উল্লেখ করে যে এটি এই উদ্দেশ্যে কাজ করবে না।
জিরো 3

2

এটা চমত্কার ভাবে কাজ করেছে!

int[] mInt = new int[10];
Integer[] mInteger = new Integer[mInt.length];

List<Integer> wrapper = new AbstractList<Integer>() {
    @Override
    public int size() {
        return mInt.length;
    }

    @Override
    public Integer get(int i) {
        return mInt[i];
    }
};

wrapper.toArray(mInteger);

হাই তুনাকি, আপনি কি দয়া করে আমার জন্য উপরের কোডটি ব্যাখ্যা করতে পারেন? আমি যখন ডিবাগারের মধ্য দিয়ে চলি তখন দেখি যে গেট এবং সাইজ পদ্ধতিটি স্বয়ংক্রিয়ভাবে কল হয়ে যায়, অর্থাত্ এগুলি স্পষ্টতই বলা হয়ে থাকে !! তা কিভাবে?! আপনি দয়া করে ব্যাখ্যা করতে পারেন?
forkdbloke

0

পূর্ণ রূপান্তর করুন [] পূর্ণসংখ্যা থেকে []:

    import java.util.Arrays;
    ...

    int[] aint = {1,2,3,4,5,6,7,8,9,10};
    Integer[] aInt = new Integer[aint.length];

    Arrays.setAll(aInt, i -> aint[i]);

-1

আপনার দরকার নেই int[]একটি অবজেক্ট এবং মানচিত্রের ভিতরে কী হিসাবে ব্যবহার করা যেতে পারে।

Map<int[], Double> frequencies = new HashMap<int[], Double>();

ফ্রিকোয়েন্সি মানচিত্রের যথাযথ সংজ্ঞা।

এটি ভুল ছিল :-)। সঠিক সমাধানটি পোস্ট করা হয় :-)।


আপনার জবাবের জন্য অনেক ধন্যবাদ আমি প্রথমে এটি চেষ্টা করেছি এবং এটি জরিমানা সংকলিত হয়েছে, তবে মনে হয় এটি frequencies.containsKey(q)সর্বদা মিথ্যা হবে এমনকি আমি putদু'বার একই অ্যারে থাকলেও - এখানে জাভা'র সংখ্যার সাথে সাম্যের সংজ্ঞা জড়িত রয়েছে এমন কিছু ভুল আছে?

1
।। (ইঙ্গিত, (নতুন int- এ [0]) সমান (নতুন int- এ [0]) মিথ্যা; (নতুন ArrayList <integer> ()) সমান (নতুন ArrayList <স্ট্রিং> ()) সত্য।
টম Hawtin - tackline

1
খারাপ ধারণা, অ্যারে তুলনা রেফারেন্স সমতার উপর ভিত্তি করে । এজন্য
অ্যারে.ইকুয়ালস

জঘন্য :-)। আমি ঠিক ছিলাম আশা করছি। ঘোষণাটি সঠিক তবে রেফারেন্স সমতা আইটেমটির কারণে শব্দার্থবিজ্ঞানগুলি ভুল।
মিহাই টুডার

-3

সহজভাবে ব্যবহার করুন:

public static int[] intArrayToIntegerArray(int[] a) {
    Integer[] b = new Integer[a.length];
    for(int i = 0; i < array.length; i++){
        b[i] = a[i];
    }
    return g;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.