ฉันจะเพิ่มรายการในอาร์เรย์ Java แบบไดนามิกได้อย่างไร


86

ใน PHP คุณสามารถเพิ่มองค์ประกอบในอาร์เรย์แบบไดนามิกได้ดังต่อไปนี้:

$x = new Array();
$x[] = 1;
$x[] = 2;

หลังจากนี้จะเป็นอาร์เรย์เช่นนี้$x{1,2}

มีวิธีทำคล้าย ๆ กันใน Java หรือไม่?


4
สำหรับคำตอบทั้งหมดด้านล่างใช้ ArrayList แต่ OP ขอ Array โดยเฉพาะ ฉันก็อยากจะรู้เช่นกัน
KJYe.Name 葉家仁

4
คำตอบคือ 'ไม่' คุณต้องระบุขนาดของอาร์เรย์ (หรือเติมองค์ประกอบทั้งหมด) ในเวลาที่ประกาศ / สร้างใน Java โปรดดูjava.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
Ritesh

ฉันสังเกตเห็นว่าฟังก์ชันต่างๆของ Java ส่งคืนอาร์เรย์ดังนั้นให้ดูที่การใช้รายการ (ตัวกรอง) ใน File.java ใช้ List ภายในแล้วแปลงเป็นอาร์เรย์ในตอนท้าย รายการ <String> v = ArrayList ใหม่ <> (); ... กลับ v.toArray (สตริงใหม่ [v.size ()]);
xtempore

คำตอบ:


112

ดูที่ java.util.LinkedList หรือ java.util.ArrayList

List<Integer> x = new ArrayList<Integer>();
x.add(1);
x.add(2);

21
นี่เป็นคำตอบที่สมบูรณ์แบบยกเว้นชิ้นเดียว โดยปกติใน Java เราจะใช้ List แทนอาร์เรย์ดั้งเดิม แต่สำหรับอินสแตนซ์ที่คุณต้องการอาร์เรย์แบบดั้งเดิม (เช่นint[]) เพียงแค่ใช้toArray()วิธีการใน List ใช้โค้ดด้านบน แต่ใช้x.toArray()เพื่อรับ Array ดั้งเดิม
rharter

1
ใน 99% ของเคส (เช่น 99.99999% ของเคส) หากคุณต้องการอาร์เรย์แบบดั้งเดิมจริง ๆ คุณกำลังทำอะไรผิดพลาดและควรจัดการด้วยหลักการ OO เว้นแต่คุณจะเชื่อมต่อกับโค้ดเนทีฟหรือบางอย่างเช่นARRAYอ็อบเจ็กต์Oracle หรือความโง่เขลาเช่นนั้นคุณจะหลีกเลี่ยงอาร์เรย์ดั้งเดิมได้ดีกว่า
corsiKa

11
โอ้ความคิดเห็นทั้งหมดนี้เกี่ยวกับวิธีที่คุณไม่ควรใช้อาร์เรย์ดั้งเดิมถ้ามันง่ายแค่นั้น :(
thecoshman

1
@trusktr นั่นเป็นเหตุผลหนึ่งที่ต้องทำ ในตัวอย่างนี้การใช้การListอ้างอิงช่วยให้เราเตะArrayListไปที่ขอบถนนได้ตลอดเวลาที่ต้องการ ถ้ามีคนออกรายการที่ดีกว่าเช่นเราอาจจะมีจำนวนมากของงานที่ต้องทำถ้าเราทำของเราอ้างอิงSuperDuperAwesomeList ArrayListArrayList มีสิ่งที่ List ไม่มี หากเราพึ่งพาสิ่งเหล่านั้นในโค้ดของเรามันจะยากกว่ามากที่จะเปลี่ยนออก
corsiKa

1
@corsiKa เขียนอัลกอริธึมการบีบอัด / การเข้ารหัสโดยไม่ใช้แบบดั้งเดิมและกรณีเหล่านี้พบได้บ่อยกว่า 99 (9) Маtrixแสดงถึงการกรีดร้องอย่างเป็นธรรมชาติเช่นกัน ในบันทึกพลิกหากคุณโต้ตอบกับโค้ดเนทีฟคุณใช้ DirectBuffers ไม่ใช่อาร์เรย์ดั้งเดิม ในที่สุดใครบางคนต้องใช้โลหะหากคุณติดอยู่กับฐานข้อมูลและการนำเสนอก็โอเค แต่คำสั่งของ 99% นั้นโง่
bestsss

65

อาร์เรย์ใน Java มีขนาดคงที่ดังนั้นคุณจึงไม่สามารถ "เพิ่มบางอย่างต่อท้าย" ได้อย่างที่ทำได้ใน PHP

ลักษณะการทำงานของ PHP คล้ายกันเล็กน้อยคือ:

int[] addElement(int[] org, int added) {
    int[] result = Arrays.copyOf(org, org.length +1);
    result[org.length] = added;
    return result;
}

จากนั้นคุณสามารถเขียน:

x = new int[0];
x = addElement(x, 1);
x = addElement(x, 2);

System.out.println(Arrays.toString(x));

แต่โครงร่างนี้ไม่มีประสิทธิภาพอย่างมากสำหรับอาร์เรย์ที่มีขนาดใหญ่เนื่องจากจะสร้างสำเนาของอาร์เรย์ทั้งหมดในแต่ละครั้ง (และในความเป็นจริงมันไม่เทียบเท่ากับ PHP อย่างสมบูรณ์เนื่องจากอาร์เรย์เก่าของคุณยังคงเหมือนเดิม)

ในความเป็นจริงอาร์เรย์ PHP นั้นค่อนข้างเหมือนกับ Java HashMap ที่มี "คีย์สูงสุด" ที่เพิ่มเข้ามาดังนั้นจึงจะรู้ว่าจะใช้คีย์ใดต่อไปและลำดับการทำซ้ำที่แปลกประหลาด (และความสัมพันธ์ระหว่างคีย์จำนวนเต็มกับสตริงบางตัว) แต่สำหรับคอลเลกชันที่จัดทำดัชนีอย่างง่ายให้ใช้ List ใน Java ดีกว่าเช่นเดียวกับคำตอบอื่น ๆ ที่เสนอ

หากคุณต้องการหลีกเลี่ยงการใช้Listเนื่องจากค่าใช้จ่ายในการตัดทุก int ในจำนวนเต็มให้พิจารณาใช้การใช้คอลเลกชันซ้ำสำหรับประเภทดั้งเดิมซึ่งใช้อาร์เรย์ภายใน แต่จะไม่ทำสำเนาในทุกการเปลี่ยนแปลงเฉพาะเมื่ออาร์เรย์ภายในเต็ม ( เช่นเดียวกับ ArrayList) (ตัวอย่างหนึ่งของ googled อย่างรวดเร็วคือคลาส IntListนี้)

ฝรั่งมีวิธีการสร้างห่อดังกล่าวในInts.asList, Longs.asListฯลฯ


มันฉลาดกว่าโซลูชันที่ได้รับการยอมรับมาก ไม่มีวัตถุที่สูญเปล่า
หมอก

2
@Mihail: ตามจริงแล้วฉันไม่แนะนำให้ทำเช่นนี้เนื่องจากสำหรับการเพิ่มองค์ประกอบแต่ละครั้งจะมีการสร้างอาร์เรย์ใหม่และคัดลอกเนื้อหาทั้งหมด (ขึ้นอยู่กับกรณีการใช้งานของคุณ - ถ้าคุณแทบจะไม่เพิ่ม / ลบอะไรเลยและมักจะวนซ้ำ / ค้นหาก็อาจจะไม่เป็นไร)
Paŭlo Ebermann

ArrayUtils ในเวอร์ชันที่ใหม่กว่ามีวิธีการที่ทำเช่นนั้น ฉันค่อนข้างขี้เกียจที่จะตรวจสอบการใช้งาน แต่ฉันค่อนข้างมั่นใจว่าพวกเขาเขียนได้ดี
หมอก

1
@MihailStoynov จริงๆแล้วนี่คือสิ่งที่ArrayListทำ - ยกเว้นว่าแทนที่จะปรับขนาดทุกส่วนเพิ่มเมื่อหมดห้องมันจะมีขนาดเพิ่มขึ้นเป็นสองเท่าดังนั้นจึงไม่ต้องปรับขนาดใกล้กันบ่อยนัก
corsiKa

1
@Mav ไม่เพราะorgสั้นกว่าresult.
Paŭlo Ebermann

19

Apache Commons มีการใช้งานArrayUtilsเพื่อเพิ่มองค์ประกอบที่ส่วนท้ายของอาร์เรย์ใหม่:

/** Copies the given array and adds the given element at the end of the new array. */
public static <T> T[] add(T[] array, T element)

2
ใน ArrayUtils ที่ใหม่กว่าคือ: ArrayUtils.appendElement (String.class, origArray, "new element")
marmor

12

ฉันเห็นคำถามนี้บ่อยมากในเว็บและในความคิดของฉันหลายคนที่มีชื่อเสียงระดับสูงไม่ได้ตอบคำถามเหล่านี้อย่างถูกต้อง ดังนั้นฉันขอแสดงคำตอบของตัวเองที่นี่

ครั้งแรกที่เราควรพิจารณามีความแตกต่างระหว่างและarrayarraylist

คำถามที่ถามว่าสำหรับการเพิ่มองค์ประกอบไปยังอาร์เรย์และไม่ ArrayList


คำตอบนั้นค่อนข้างง่าย สามารถทำได้ 3 ขั้นตอน

  1. แปลงอาร์เรย์เป็นรายการอาร์เรย์
  2. เพิ่มองค์ประกอบใน arrayList
  3. แปลง arrayList ใหม่กลับเป็นอาร์เรย์

นี่คือภาพง่ายๆของมัน ใส่คำอธิบายภาพที่นี่

และสุดท้ายนี่คือรหัส:

ขั้นตอนที่ 1:

public List<String> convertArrayToList(String[] array){
        List<String> stringList = new ArrayList<String>(Arrays.asList(array));
        return stringList;
    }

ขั้นตอนที่ 2:

public  List<String> addToList(String element,List<String> list){

            list.add(element);
            return list;
    }

ขั้นตอนที่ 3:

public String[] convertListToArray(List<String> list){
           String[] ins = (String[])list.toArray(new String[list.size()]);
           return ins;
    } 

ขั้นตอนที่ 4

public String[] addNewItemToArray(String element,String [] array){
        List<String> list = convertArrayToList(array);
        list= addToList(element,list);
        return  convertListToArray(list);
}

1
โหวตขึ้นเพราะในที่สุดก็มีคนเรียกความแตกต่างระหว่างอาร์เรย์จริงและ ArrayList ...
JoeG

คำตอบที่สมบูรณ์และอธิบายได้มากที่สุด
Obaid

11

คุณสามารถใช้ArrayListและใช้toArray()วิธีการ แต่ขึ้นอยู่กับว่าคุณกำลังทำอะไรอยู่คุณอาจไม่จำเป็นต้องใช้อาร์เรย์เลยด้วยซ้ำ ดูว่าListsมีอะไรมากกว่าที่คุณต้องการหรือไม่

ดู: บทแนะนำรายการ Java



4

คุณสามารถเพิ่มองค์ประกอบในอาร์เรย์แบบไดนามิกโดยใช้ Collection Frameworks ใน JAVA กรอบการรวบรวมไม่ทำงานกับชนิดข้อมูลดั้งเดิม

กรอบงานคอลเล็กชันนี้จะมีอยู่ในแพ็คเกจ "java.util. *"

ตัวอย่างเช่นหากคุณใช้ ArrayList

สร้างวัตถุขึ้นมาจากนั้นเพิ่มจำนวนองค์ประกอบ (ประเภทใดก็ได้เช่น String, Integer ... ฯลฯ )

ArrayList a = new ArrayList();
a.add("suman");
a.add(new Integer(3));
a.add("gurram");

ตอนนี้คุณถูกเพิ่ม 3 องค์ประกอบในอาร์เรย์

หากคุณต้องการลบองค์ประกอบใด ๆ ที่เพิ่มเข้ามา

a.remove("suman");

อีกครั้งหากคุณต้องการเพิ่มองค์ประกอบใด ๆ

a.add("Gurram");

ดังนั้นขนาดอาร์เรย์จึงเพิ่มขึ้น / ลดลงแบบไดนามิก ..



0

นับว่าคุณอยู่ที่ไหนในอาร์เรย์ดั้งเดิม

class recordStuff extends Thread
{
    double[] aListOfDoubles;
    int i = 0;

    void run()
    {
        double newData;
        newData = getNewData(); // gets data from somewhere

        aListofDoubles[i] = newData; // adds it to the primitive array of doubles
        i++ // increments the counter for the next pass

        System.out.println("mode: " + doStuff());
    }

    void doStuff()
    {
        // Calculate the mode of the double[] array

        for (int i = 0; i < aListOfDoubles.length; i++) 
        {
            int count = 0;
            for (int j = 0; j < aListOfDoubles.length; j++)
            {
                if (a[j] == a[i]) count++;
            }
            if (count > maxCount) 
            {
                maxCount = count;
                maxValue = aListOfDoubles[i];
            }
        }
        return maxValue;
    }
}

สิ่งนี้ไม่เกี่ยวข้องกับคำถามเดิมที่ว่าเป็นไปได้หรือไม่ที่จะผนวกรายการใหม่เข้ากับอาร์เรย์ดั้งเดิมของ Java แบบไดนามิก
โจเดย์

0

นี่เป็นวิธีง่ายๆในการเพิ่มอาร์เรย์ใน java ฉันใช้อาร์เรย์ที่สองเพื่อจัดเก็บอาร์เรย์เดิมของฉันแล้วเพิ่มอีกหนึ่งองค์ประกอบเข้าไป หลังจากนั้นฉันก็ส่งอาร์เรย์นั้นกลับไปที่อาร์เรย์เดิม

    int [] test = {12,22,33};
    int [] test2= new int[test.length+1];
    int m=5;int mz=0;
    for ( int test3: test)        
    {          
    test2[mz]=test3; mz++;        
    } 
    test2[mz++]=m;
    test=test2;

    for ( int test3: test)

    {
      System.out.println(test3);
    }

0

ในขนาดของอาร์เรย์ Java ได้รับการแก้ไข แต่คุณสามารถเพิ่มองค์ประกอบแบบไดนามิกให้กับอาร์เรย์ขนาดคงที่โดยใช้ดัชนีและสำหรับลูป โปรดดูตัวอย่างด้านล่าง

package simplejava;

import java.util.Arrays;

/**
 *
 * @author sashant
 */
public class SimpleJava {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        try{
            String[] transactions;
            transactions = new String[10];

            for(int i = 0; i < transactions.length; i++){
                transactions[i] = "transaction - "+Integer.toString(i);            
            }

            System.out.println(Arrays.toString(transactions));

        }catch(Exception exc){
            System.out.println(exc.getMessage());
            System.out.println(Arrays.toString(exc.getStackTrace()));
        }
    }

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.