วิธีเริ่มต้นองค์ประกอบทั้งหมดของอาร์เรย์เป็นค่าเฉพาะใน java


108

ในC/C++เรามีmemset()ฟังก์ชั่นที่สามารถเติมเต็มความปรารถนาของฉัน แต่Javaฉันจะเริ่มต้นองค์ประกอบทั้งหมดให้เป็นค่าเฉพาะได้อย่างไร? เมื่อใดก็ตามที่เราเขียนint[] array=new int[10];สิ่งนี้เพียงแค่เริ่มต้นอาร์เรย์ขนาด 10 โดยมีองค์ประกอบทั้งหมดเท่ากับศูนย์ ฉันแค่ต้องการเปลี่ยนจำนวนเต็มการเริ่มต้นนี้สำหรับอาร์เรย์ของฉัน -1คือผมอยากจะเริ่มต้นอาร์เรย์ซึ่งมีองค์ประกอบทั้งหมดเท่ากับ มิฉะนั้นผมต้องใส่forห่วงเพียงหลังจากที่เริ่มต้นซึ่งช่วงจากดัชนี0การจัดทำดัชนีและภายในห่วงว่าฉันกำลังกำหนดองค์ประกอบsize-1 -1ด้านล่างนี้คือรหัสเพื่อความเข้าใจเพิ่มเติม -

    int[] array = new int[10];
    for (int i = 0; i < size; i++) {
        array[i] = -1;
    }

ฉันทำถูกต้องหรือไม่? มีวิธีอื่นที่เหมือนกันหรือไม่?

คำตอบ:


214

หากเป็นประเภทดั้งเดิมคุณสามารถใช้Arrays.fill():

Arrays.fill(array, -1);

[ อนึ่งmemsetใน C หรือ C ++ เป็นเพียงการใช้งานจริงสำหรับอาร์เรย์ของchar. ]


17
ฉันตรวจสอบซอร์สโค้ดของArrays.fill(). มันทำสิ่งเดียวกัน public static void fill(int[] a, int val) { for (int i = 0, len = a.length; i < len; i++) a[i] = val; }
Ravi Joshi

2
ใช่. อย่างที่ควรจะเป็น. แม้ว่าฉันสงสัยว่า JIT อาจฉลาดพอที่จะปรับปรุงการใช้งานพื้นฐาน
Louis Wasserman

1
ฉันไม่เห็นด้วย. memsetยังสามารถใช้งานได้และในความเป็นจริงมีประโยชน์มากในอาร์เรย์จำนวนเต็มเมื่อคุณต้องการเติม0หรือ-1ตัวอย่างเช่นในปัญหา DP
Sнаđошƒаӽ

@ Sнаđошƒаӽ - ไม่ใช่แบบพกพา
Oliver Charlesworth

1
เพียงแค่ FYI: คุณสามารถใช้ memset_pattern4, 8 และ 16 สำหรับขนาดจำนวนเต็มอื่น ๆ
geowar


5

เป็นไปได้ด้วยสตรีม Java 8:

int[] a = IntStream.generate(() -> value).limit(count).toArray();

อย่างไรก็ตามอาจไม่ใช่วิธีที่มีประสิทธิภาพสูงสุดในการทำงาน


สิ่งนี้จะใช้ได้กับชนิดที่ไม่ใช่แบบดั้งเดิม ( Stream.generate(() -> new Whatever("Hello World", 42)).limit(count).toArray();) ดังนั้นจึงมีความยืดหยุ่นมากกว่า Arrays.fill () ไม่แน่ใจในประสิทธิภาพ แต่อย่างที่บอก
Christopher Riches

3

คุณสามารถทำได้ถ้ามันสั้น:

int[] array = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};

แต่นั่นกลับแย่ไปกว่านั้น

ง่ายกว่าคือการforวนซ้ำ:

  int[] myArray = new int[10];
  for (int i = 0; i < array.length; i++)
       myArray[i] = -1;

แก้ไข: ฉันชอบArrays.fill()ตัวเลือกที่คนอื่นพูดถึง


มีข้อกำหนดในการเริ่มต้นอาร์เรย์ 2 มิติหรือไม่? บางอย่างเช่น int a [] [] = new int [3] [4]; Arrays.fill (a, -1); เพื่อให้ทั้ง 12 องค์ประกอบถูกตั้งค่าด้วย -1
PoornaChandra


1

คุณได้ลองใช้ฟังก์ชัน Arrays.fill แล้วหรือยัง?


ไม่ เมื่อก่อนไม่ได้ใช้
Ravi Joshi

คุณช่วยยกตัวอย่างได้ไหมว่าสิ่งนี้มีลักษณะอย่างไร
Aenadon

@Aenadon: ดูคำตอบที่ยอมรับ ซึ่งแสดงฟังก์ชัน Arrays.fill
Sam Goldberg

0

คุณสามารถใช้Arrays.fill(array, -1).


0

เห็นได้ชัดว่าคุณสามารถใช้ Arrays.fill () วิธีที่คุณทำก็ใช้ได้เช่นกัน


ยะ. แม้จะArrays.fill()ใช้forวงที่มีค่าดัชนีการ0 size-1ในทำนองเดียวกันสิ่งที่ฉันทำ ขอบคุณสำหรับคำตอบ.
Ravi Joshi

0

โดยใช้ Java 8 คุณก็สามารถใช้ncopiesของCollectionsชั้นเรียน:

Object[] arrays = Collections.nCopies(size, object).stream().toArray();

ในกรณีของคุณจะเป็น:

Integer[] arrays = Collections.nCopies(10, Integer.valueOf(1)).stream().toArray(Integer[]::new);
.

นี่คือคำตอบโดยละเอียดเกี่ยวกับกรณีที่คล้ายกันของคุณ


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