অ্যারেতে নতুন উপাদানগুলি কীভাবে যুক্ত করবেন?


291

আমার কাছে নিম্নলিখিত কোড রয়েছে:

String[] where;
where.append(ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1");
where.append(ContactsContract.Contacts.IN_VISIBLE_GROUP + "=1");

এই দুটি সংযোজন সংকলন করছে না। কিভাবে যে সঠিকভাবে কাজ করবে?

উত্তর:


395

অ্যারের আকার পরিবর্তন করা যায় না can't আপনি যদি আরও বড় অ্যারে চান তবে আপনাকে একটি নতুন ইনস্ট্যান্ট করতে হবে।

একটি ভাল সমাধান ArrayListহ'ল এটির প্রয়োজন মতো বাড়তে পারে যা ব্যবহার করতে পারে। ArrayList.toArray( T[] a )আপনার যদি এই ফর্মের প্রয়োজন হয় তবে পদ্ধতিটি আপনাকে আপনার অ্যারে ফিরিয়ে দেয়।

List<String> where = new ArrayList<String>();
where.add( ContactsContract.Contacts.HAS_PHONE_NUMBER+"=1" );
where.add( ContactsContract.Contacts.IN_VISIBLE_GROUP+"=1" );

আপনার যদি এটিকে একটি সাধারণ অ্যারেতে রূপান্তর করা দরকার ...

String[] simpleArray = new String[ where.size() ];
where.toArray( simpleArray );

তবে আপনি অ্যারে দিয়ে বেশিরভাগ জিনিসগুলি আপনি এই অ্যারেলিস্টের সাথেও করতে পারেন:

// iterate over the array
for( String oneItem : where ) {
    ...
}

// get specific items
where.get( 1 );

9
অ্যারেলিস্ট দিয়ে যদি আপনি একই কাজ করতে পারেন তবে অ্যারে ব্যবহারে কী লাভ?
স্কুয়া

@ tangens.I নতুন am কে Android কিন্তু আপনার উত্তর সাহায্য me.before গবেষনার উত্তর আমি অনেক ঘন্টা বরবাদ
স্কট

1
@ স্কুয়া অ্যারে আরও দক্ষ অবজেক্ট সাইজের প্রাক-সংজ্ঞায়িতকরণ সংকলকটিকে মেমরিটিকে অনুকূল করতে দেয়। কিছু অ্যাপ্লিকেশনগুলির জন্য এটি গুরুত্বপূর্ণ। একটি আধুনিক কম্পিউটারে চলমান একটি ছোট অ্যাপ্লিকেশন সম্ভবত স্মৃতিতে সমস্যা হওয়ার আগে প্রচুর তালিকাগুলি নিয়ে চলে যেতে পারে।
ড্রাক্সডম্যাক্স

102

List<String>যেমন একটি ব্যবহার করুন ArrayList<String>। এটি অ্যারেগুলির থেকে পৃথকভাবে গতিশীলভাবে বিকাশযোগ্য (দেখুন: কার্যকর জাভা 2 য় সংস্করণ, আইটেম 25: তালিকাতে অ্যারেগুলিতে পছন্দ করুন )।

import java.util.*;
//....

List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
System.out.println(list); // prints "[1, 2, 3]"

আপনি যদি অ্যারেগুলি ব্যবহারের java.util.Arrays.copyOfজন্য জোর দিয়ে থাকেন তবে অতিরিক্ত উপাদানকে সংযোজন করতে আপনি বড় অ্যারে বরাদ্দ করতে ব্যবহার করতে পারেন । যদিও এটি সর্বোত্তম সমাধান নয়।

static <T> T[] append(T[] arr, T element) {
    final int N = arr.length;
    arr = Arrays.copyOf(arr, N + 1);
    arr[N] = element;
    return arr;
}

String[] arr = { "1", "2", "3" };
System.out.println(Arrays.toString(arr)); // prints "[1, 2, 3]"
arr = append(arr, "4");
System.out.println(Arrays.toString(arr)); // prints "[1, 2, 3, 4]"

এটি O(N)প্রতি appendArrayListঅন্যদিকে, O(1)অপারেশন অনুসারে ব্যয় মোতাবিভক্ত হয়েছে ।

আরো দেখুন


প্রতিবার ক্ষমতা যথেষ্ট না হলে আপনি অ্যারের আকার দ্বিগুণ করতে পারেন। এই উপায়ে সংযোজন করা হবে ও (1)। সম্ভবত ArrayListঅভ্যন্তরীণভাবে কি করে।
সিয়ুয়ান রেন

32

অ্যাপাচি কমন্স ল্যাং আছে

T[] t = ArrayUtils.add( initialArray, newitem );

এটি একটি নতুন অ্যারে প্রদান করে, তবে যদি আপনি সত্যিই কোনও কারণে অ্যারে নিয়ে কাজ করছেন তবে এটি করার এটি আদর্শ উপায়।


23

এখানে অন্য বিকল্প রয়েছে যা আমি এখানে দেখিনি এবং এতে "জটিল" অবজেক্টস বা সংগ্রহগুলি জড়িত নয়।

String[] array1 = new String[]{"one", "two"};
String[] array2 = new String[]{"three"};
String[] array = new String[array1.length + array2.length];
System.arraycopy(array1, 0, array, 0, array1.length);
System.arraycopy(array2, 0, array, array1.length, array2.length);

14

append()অ্যারেতে কোনও পদ্ধতি নেই । পরিবর্তে ইতিমধ্যে প্রস্তাবিত একটি তালিকার অবজেক্টটি উপাদানকে যেমন গতিশীলভাবে সন্নিবেশ করানোর প্রয়োজনের পরিবেশন করতে পারে

List<String> where = new ArrayList<String>();
where.add(ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1");
where.add(ContactsContract.Contacts.IN_VISIBLE_GROUP + "=1");

বা আপনি যদি সত্যিই কোনও অ্যারে ব্যবহার করতে আগ্রহী হন:

String[] where = new String[]{
    ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1",
    ContactsContract.Contacts.IN_VISIBLE_GROUP + "=1"
};

তবে তারপরে এটি একটি নির্দিষ্ট আকার এবং কোনও উপাদান যুক্ত করা যায় না।


সুতরাং একটি প্যারামিটারাইজড ক্যোয়ারী অ্যারেলিস্টকেও বাছাইআর্গ হিসাবে গ্রহণ করে?
স্কাইনেট

7

যেমন টাংগেনস বলেছেন, একটি অ্যারের আকার স্থির করা আছে। তবে আপনাকে প্রথমে এটি ইনস্ট্যান্ট করতে হবে, অন্যথায় এটি কেবল নাল রেফারেন্স হবে।

String[] where = new String[10];

এই অ্যারেতে কেবলমাত্র 10 টি উপাদান থাকতে পারে। সুতরাং আপনি কেবল 10 বার একটি মূল্য সংযোজন করতে পারেন। আপনার কোডে আপনি একটি নাল রেফারেন্স অ্যাক্সেস করছেন। এ কারণেই এটি কাজ করে না। গতিশীলভাবে ক্রমবর্ধমান সংগ্রহের জন্য, অ্যারেলিস্টটি ব্যবহার করুন।


7
String[] source = new String[] { "a", "b", "c", "d" };
String[] destination = new String[source.length + 2];
destination[0] = "/bin/sh";
destination[1] = "-c";
System.arraycopy(source, 0, destination, 2, source.length);

for (String parts : destination) {
  System.out.println(parts);
}

6

আমি এই কোড তৈরি করেছি! এটি যাদুমন্ত্রের মত কাজ করে!

public String[] AddToStringArray(String[] oldArray, String newString)
{
    String[] newArray = Arrays.copyOf(oldArray, oldArray.length+1);
    newArray[oldArray.length] = newString;
    return newArray;
}

আশা করি তুমি পছন্দ করেছ!!


5

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


4

আপনি যদি এই জাতীয় উপায়ে আপনার ডেটা সঞ্চয় করতে চান

String[] where = new String[10];

এবং আপনি সংখ্যার মতো এর সাথে কিছু উপাদান যুক্ত করতে চান আমাদের দয়া করে স্ট্রিংবিল্ডার যা সংক্ষিপ্তকরণের স্ট্রিংয়ের চেয়ে অনেক বেশি দক্ষ।

StringBuilder phoneNumber = new StringBuilder();
phoneNumber.append("1");
phoneNumber.append("2");
where[0] = phoneNumber.toString();

আপনার স্ট্রিংটি তৈরি করতে এবং এটি আপনার 'যেখানে' অ্যারেতে সঞ্চয় করার জন্য এটি আরও ভাল পদ্ধতি।


4

স্ট্রিং অ্যারেতে নতুন আইটেম যুক্ত করা হচ্ছে।

String[] myArray = new String[] {"x", "y"};

// Convert array to list
List<String> listFromArray = Arrays.asList(myArray);

// Create new list, because, List to Array always returns a fixed-size list backed by the specified array.
List<String> tempList = new ArrayList<String>(listFromArray);
tempList.add("z");

//Convert list back to array
String[] tempArray = new String[tempList.size()];
myArray = tempList.toArray(tempArray);

1
আহ, আমি দেখছি আপনি <code>ট্যাগটি ব্যবহার করেছেন এবং এতে জেনেরিক ধরণের সমস্যা ছিল। দয়া করে এই ট্যাগটি এড়াতে চেষ্টা করুন, যেহেতু ... এতে সমস্যা রয়েছে এবং সঠিক ফর্ম্যাটিং পেতে আপনার কোডটি 4 সাদা স্পেসে যুক্ত করুন। আমি আপনার প্রশ্নের জন্য এটি করেছি :)।
টম

4

অ্যারেতে উপাদান যুক্ত করার বিভিন্ন উপায় রয়েছে। আপনি Listউপাদানটি পরিচালনা করতে একটি টেম্প ব্যবহার করতে পারেন এবং তারপরে এটিকে রূপান্তর Arrayকরতে পারেন বা আপনি এটি ব্যবহার করতে পারেনjava.util.Arrays.copyOf আরও ভাল ফলাফলের জন্য এবং জেনেরিকের সাথে একত্র ।

এই উদাহরণটি আপনাকে প্রদর্শন করবে কীভাবে:

public static <T> T[] append2Array(T[] elements, T element)
{
    T[] newArray = Arrays.copyOf(elements, elements.length + 1);
    newArray[elements.length] = element;

    return newArray;
}

এই পদ্ধতিটি ব্যবহার করার জন্য আপনাকে কেবল এটির মতো কল করতে হবে:

String[] numbers = new String[]{"one", "two", "three"};
System.out.println(Arrays.toString(numbers));
numbers = append2Array(numbers, "four");
System.out.println(Arrays.toString(numbers));

আপনি যদি দুটি অ্যারে মার্জ করতে চান তবে আপনি আগের পদ্ধতিটি এভাবে পরিবর্তন করতে পারেন:

public static <T> T[] append2Array(T[] elements, T[] newElements)
{
    T[] newArray = Arrays.copyOf(elements, elements.length + newElements.length);
    System.arraycopy(newElements, 0, newArray, elements.length, newElements.length);

    return newArray;
}

এখন আপনি এই পদ্ধতিটি কল করতে পারেন:

String[] numbers = new String[]{"one", "two", "three"};
String[] moreNumbers = new String[]{"four", "five", "six"};
System.out.println(Arrays.toString(numbers));
numbers = append2Array(numbers, moreNumbers);
System.out.println(Arrays.toString(numbers));

যেমনটি আমি উল্লেখ করেছি, আপনি Listবস্তুগুলিও ব্যবহার করতে পারেন । যাইহোক, এটির মতো এটি নিরাপদ কাস্ট করতে একটু হ্যাক লাগবে:

public static <T> T[] append2Array(Class<T[]> clazz, List<T> elements, T element)
{
    elements.add(element);
    return clazz.cast(elements.toArray());
}

এখন আপনি এই পদ্ধতিটি কল করতে পারেন:

String[] numbers = new String[]{"one", "two", "three"};
System.out.println(Arrays.toString(numbers));
numbers = append2Array(String[].class, Arrays.asList(numbers), "four");
System.out.println(Arrays.toString(numbers));

newArray[elements.length] = element;, মানে newArray[elements.length - 1] = element;?
ডেভিড রিক্সিটেলি

3

আমি জাভাতে অভিজ্ঞ নই তবে আমাকে সর্বদা বলা হয়েছে যে অ্যারেগুলি স্থির কাঠামো যার পূর্বনির্ধারিত আকার রয়েছে। আপনাকে একটি অ্যারেলিস্ট বা ভেক্টর বা অন্য কোনও গতিশীল কাঠামো ব্যবহার করতে হবে।


2

আপনি একটি অ্যারেলিস্ট তৈরি করতে পারেন এবং Collection.addAll()স্ট্রিং অ্যারেটিকে আপনার অ্যারেলিস্টে রূপান্তর করতে ব্যবহার করতে পারেন



2

কেউ যদি সত্যিই একটি অ্যারের আকার পরিবর্তন করতে চায় আপনি এই জাতীয় কিছু করতে পারেন:

String[] arr = {"a", "b", "c"};
System.out.println(Arrays.toString(arr)); 
// Output is: [a, b, c]

arr = Arrays.copyOf(arr, 10); // new size will be 10 elements
arr[3] = "d";
arr[4] = "e";
arr[5] = "f";

System.out.println(Arrays.toString(arr));
// Output is: [a, b, c, d, e, f, null, null, null, null]

1

অ্যারের আকার পরিবর্তন করা যায় না। যদি আপনাকে কোনও অ্যারে ব্যবহার করতে হয় তবে আপনি ব্যবহার করতে পারেন:

System.arraycopy(src, srcpos, dest, destpos, length); 

0

এটি যথেষ্ট পরিমাণে বড় মেমরির আকার পূর্ব-বরাদ্দ করাও সম্ভব। এখানে একটি সাধারণ স্ট্যাক প্রয়োগ: প্রোগ্রামটি 3 এবং 5 আউটপুট দেওয়ার কথা।

class Stk {
    static public final int STKSIZ = 256;
    public int[] info = new int[STKSIZ];
    public int sp = 0; // stack pointer
    public void push(int value) {
        info[sp++] = value;
    }
}
class App {
    public static void main(String[] args) {
        Stk stk = new Stk();
        stk.push(3);
        stk.push(5);
        System.out.println(stk.info[0]);
        System.out.println(stk.info[1]);
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.