ฉันจะกำหนดตัวแปรจำนวนอนันต์ได้อย่างไร? *จาวา*

ฉันกำลังสร้างเกม และต้องใช้สี่เหลี่ยมจำนวนไม่สิ้นสุด ตัวอย่างเช่น สมมติว่าฉันตั้งชื่อตัวแปรว่า car:

public Rectangle car1;
public Rectangle car2;
public Rectangle car3;

และอื่นๆ

จะมีวิธีที่ง่ายกว่านี้ไหม? ชอบ:

public int carNumber;
public Rectange car + carNumber;//if carNumber was one, it would be called car1

นอกจากนี้ ฉันจะต้องทดสอบว่าสี่เหลี่ยมนั้นมีอย่างอื่นด้วยหรือไม่ ‹-- ฉันรู้วิธีการทำเช่นนี้


person Calan54    schedule 13.04.2014    source แหล่งที่มา
comment
เคล็ดลับ: หากคุณหมายความว่าคุณไม่ทราบล่วงหน้าว่าคุณจะต้องใช้สี่เหลี่ยมจำนวนเท่าใด คำที่ถูกต้องคือคำว่าไม่มีกำหนด ไม่ใช่คำว่าไม่มีที่สิ้นสุด   -  person ajb    schedule 13.04.2014


คำตอบ (5)


คุณไม่สามารถและไม่ควรพยายามประกาศสิ่งใดๆ ให้เป็นจำนวนอนันต์ เพียงแต่ไม่สมเหตุสมผล ให้ใช้คอลเลกชันเช่น ArrayList ที่สามารถเก็บการอ้างอิงวัตถุจำนวนตัวแปรแทน เช่น.,

private List<Rectangle> carList = new ArrayList<>();

สิ่งนี้จะไม่ทำงาน:

public Rectange car + carNumber;//if carNumber was one, it would be called car1

เนื่องจากชื่อตัวแปรใช้งานไม่ได้ จึงไม่สามารถสร้างโดยการต่อสตริงเข้าด้วยกันได้ แต่ไม่ต้องกังวลกับเรื่องนี้ เพราะ ArrayList จะดูแลเรื่องนี้เอง รายการที่สามในรายการน่าจะหาได้ง่ายพอ: carList.get(2)


หากต้องการดูว่ารูปสี่เหลี่ยมผืนผ้าในรายการมีสี่เหลี่ยมผืนผ้าอื่นหรือไม่ ให้ใช้ for วนซ้ำและวนซ้ำในคอลเลกชัน:

for (Rectangle rect : carList) {
  if (rect.contains(testRectangle) {
     // this item contains the test Rectangle
  }
}
person Hovercraft Full Of Eels    schedule 13.04.2014
comment
ขอบคุณ แต่นี่จะยังอนุญาตให้ฉันทดสอบเมธอด contains() กับแต่ละสี่เหลี่ยมได้หรือไม่ - person Calan54; 13.04.2014
comment
@ Gokarting54: ใช่แน่นอน ไม่ใช่ตัวแปรที่สำคัญที่นี่ มันเป็นวัตถุและการอ้างอิงวัตถุที่มีความสำคัญ - person Hovercraft Full Of Eels; 13.04.2014
comment
อ๋อ เข้าใจแล้ว นี่เป็นคำถามแรกของฉันเกี่ยวกับ StackOverflow ดังนั้นฉันจึงไม่ค่อยมีชื่อเสียง แต่ถ้าฉันทำ นี่จะได้รับการโหวตเพิ่มขึ้น - person Calan54; 13.04.2014
comment
@ Gokarting54: ไม่ต้องกังวลกับการโหวตเพิ่ม คุณสามารถกลับมาใหม่ได้ในภายหลัง โปรดสังเกตการเพิ่มข้อมูล for loop เพื่อทดสอบการกักเก็บ - person Hovercraft Full Of Eels; 13.04.2014
comment
ดังนั้นในคำสั่ง 'for' ที่ใช้ด้านบน testRectangle จะเป็น car1 หากฉันมีรถยนต์ 20 คัน ฉันจะทำซ้ำรหัสเดียวกัน 20 ครั้งและแก้ไขชื่อของ 'testRectangle' หรือไม่ หรือจะสร้างการวนซ้ำ 'ในขณะที่' ได้ง่ายกว่า? - person Calan54; 13.04.2014
comment
@ Gokarting54 โปรดอย่าทำซ้ำรหัส 20 ครั้ง ฉันไม่รู้ว่าจะง่ายกว่าไหมที่จะทำซ้ำโค้ด (อาจมีโปรแกรมแก้ไขข้อความสุดเก๋บางตัว) แต่มันเป็นการฝึกเขียนโปรแกรมที่ไม่ดี หากคุณต้องทำการเปลี่ยนแปลงอัลกอริธึม และคุณมีโค้ดเดิม 20 ครั้ง คุณจะต้องทำการเปลี่ยนแปลงใน 20 ตำแหน่ง จะเกิดอะไรขึ้นถ้าคุณลืมรหัสหนึ่ง - person ajb; 14.04.2014

คุณจะต้องใช้ ArrayList เพื่อทำสิ่งนี้

person yitzih    schedule 13.04.2014

อาร์เรย์คือ static memory allocation คุณ จำเป็นต้องระบุขนาดของ ของอาร์เรย์เสมอเมื่อสร้างอาร์เรย์ ดังนั้นจึงเป็นไปไม่ได้ที่จะมีอาร์เรย์ "ไม่มีที่สิ้นสุด" สิ่งที่คุณกำลังมองหาเรียกว่า dynamic memory allocation

ตัวอย่างหนึ่งของการใช้หน่วยความจำแบบไดนามิกคือ ArrayList

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

โดยพื้นฐานแล้ว dynamic memory allocation คือสิ่งที่คุณกำลังมองหา คุณอาจลองใช้ Vector ก็ได้

person user3437460    schedule 13.04.2014
comment
1+ แม้ว่า Vector API จะแนะนำให้ใช้ ArrayLists เป็นพิเศษ - person Hovercraft Full Of Eels; 13.04.2014
comment
+1 สำหรับ ArrayList, -1 สำหรับ Vector เวกเตอร์มีการซิงโครไนซ์อย่างหนัก และหากมีวัตถุจำนวนมากอยู่ในนั้น โอเวอร์เฮดที่ซิงโครไนซ์จะเริ่มรวมกันจริงๆ - person Makoto; 13.04.2014
comment
@Makoto ฉันจะลบบรรทัดสุดท้ายเกี่ยวกับเวกเตอร์หรือไม่ - person user3437460; 13.04.2014

ขออภัย คุณไม่สามารถทำได้ใน Java คุณไม่สามารถสร้างชื่อตัวแปรแบบไดนามิกได้

ฉันกำลังสร้างเกม และต้องใช้สี่เหลี่ยมจำนวนไม่สิ้นสุด

คุณจะได้รับ OutOfMemory ในกรณีที่มีสี่เหลี่ยมจำนวนอนันต์ กรุณาคิดใหม่อีกครั้ง.


คุณสามารถใช้อาร์เรย์แบบคงที่ได้หากทราบจำนวนสี่เหลี่ยมแล้ว

Rectangle[] rec = new Rectangle[size];  

//get the first Rectangle 
Rectangle first = rec[0];

// get the total no of Rectangles
int length = rec.length();
person Braj    schedule 13.04.2014

ในโค้ดทั่วไปเช่น:

car1 = "blue";
car2 = "red";
car3 = "green";

คือ 99% ของเวลาที่แสดงเป็นอาร์เรย์ได้ดีกว่า

cars = ["blue", "red", "green"]

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

person AuthorOfTheSurf    schedule 13.04.2014