在Java中不使用排序算法,将对象元素按顺序插入数组中
我有一个编程项目ת我几乎完成了,但我正在努力将一个从控制台生成的新对象插入阵列的正确位置 我可以创建对象、在开头或结尾插入、删除对象等。但是数组需要有序(月、日、时间),我被卡住了。在Java中不使用排序算法,将对象元素按顺序插入数组中,java,arrays,algorithm,sorting,insert,Java,Arrays,Algorithm,Sorting,Insert,我有一个编程项目ת我几乎完成了,但我正在努力将一个从控制台生成的新对象插入阵列的正确位置 我可以创建对象、在开头或结尾插入、删除对象等。但是数组需要有序(月、日、时间),我被卡住了。 我已经通过论坛、信息网站、书籍等搜索了一天半,但找不到答案 另外,我不允许使用数组以外的任何东西(ArrayList、LinkedList等),也不能使用任何排序算法(bubblesort、insertionsort等) 方向特别要求我根据需要移动数组元素,并将新对象放在中间/正确的位置。我也在使用NetBeans
我已经通过论坛、信息网站、书籍等搜索了一天半,但找不到答案 另外,我不允许使用数组以外的任何东西(ArrayList、LinkedList等),也不能使用任何排序算法(bubblesort、insertionsort等) 方向特别要求我根据需要移动数组元素,并将新对象放在中间/正确的位置。我也在使用NetBeans
/*
*
*
*/
package project1;
import UserInput.UserInput;
public class Schedule {
Delivery[] deliObj = new Delivery[20];
int count = 0;
public Schedule(){//set default objects
deliObj[0] = new Delivery("MAR", 4, 17, 30, "Pizza");
count++;
deliObj[1] = new Delivery("APR", 1, 06, 30, "Special Deliery");
count++;
deliObj[2] = new Delivery("MAY", 6, 12, 00, "Amazon (Books)");
count++;
deliObj[3] = new Delivery("JUN", 3, 11, 15, "Car Parts");
count++;
}
public void setDelivery(Delivery[] deliObj){
this.deliObj = deliObj;
}
public Delivery[] getDelivery(){
return this.deliObj;
}
public static void main(String[] args){
Schedule scheduleObj = new Schedule();
scheduleObj.run();
}
public void run(){
System.out.println("\n***** MAIN DELIVERY CONSOLE *****\n");
System.out.println("A)dd delivery");
System.out.println("D)delete Delivery");
System.out.println("L)ist Delivery");
System.out.println("E)xit");
char selection = Character.toUpperCase(UserInput.getChar());
switch(selection){
case 'A': addDelivery();
break;
case 'D': deleteDelivery();
break;
case 'L': listDelivery();
break;
case 'E': System.exit(0);
}
}
public void addDelivery(){
Delivery getInputDelivery = new Delivery();
getInputDelivery.InputDelivery();
deliObj[count] = getInputDelivery;
count++;
insertDelivery(getInputDelivery);
run();
}
public void deleteDelivery(){
System.out.println("Please enter the number you wish to delete: ");
int num = UserInput.getInt(0,count);
//deliObj[num-1] = new Delivery();
deliObj[num-1] = null;
count--;
run();
}
public void listDelivery(){
for(int i=0;i<count;i++) {
System.out.println(i+1 + ". " + deliObj[i]);
}
run();
}
public boolean compareDelivery(Delivery A1, Delivery A2){
//Delivery delivery = deliObj[count-4];
int numMonth;
int numMonth1;
numMonth = Delivery.integerMonth(A1.getMonth());
numMonth1 = Delivery.integerMonth(A2.getMonth());
if(numMonth < numMonth1){
return true;
}
else if(numMonth == numMonth1){
if(A1.getDay() < A2.getDay()){
return true;
}
else if(A1.getDay() == A2.getDay()){
if(A1.getHour() < A2.getHour()){
return true;
}
else if(A1.getHour() == A2.getHour()){
if(A1.getMintute() < A2.getMintute()){
return true;
}
}
}
} //else return false;
return false;
}
public void insertDelivery(Delivery temp){
for(int i = 0; i < count; i++){
/*if(!compareDelivery(deliObj[i], temp)) {
for(int k = 1; k < count; k++) {
Delivery temp2 = deliObj[k];
deliObj[k] = deliObj[count-1];
deliObj[count-1] = temp2;
}*/
if(compareDelivery(deliObj[i], temp)) {
Delivery temp2 = deliObj[i];
deliObj[i] = deliObj[count-1];
deliObj[count-1] = temp2;
}
}
/*for (int k = 0; k < count-1; k++) {
if(compareDelivery(deliObj[k], temp)) {
Delivery temp2 = deliObj[k];
deliObj[k] = deliObj[count-1];
deliObj[count-1] = temp2;
//deliObj[count] = deliObj[k];
//deliObj[k] = deliObj[count-1];
}
} */
}
}
/*
*
*
*/
一揽子计划1;
导入UserInput.UserInput;
公课时间表{
交货[]deliObj=新交货[20];
整数计数=0;
public Schedule(){//设置默认对象
deliObj[0]=新交付(“3月”,4日,17日,30日,“比萨饼”);
计数++;
deliObj[1]=新交付(“4月1日、6日、30日,“特殊交付”);
计数++;
deliObj[2]=新交付(“5月6日、12日、00日,“亚马逊(图书)”);
计数++;
deliObj[3]=新交付(“6月”,3日,11日,15日,“汽车零件”);
计数++;
}
公共交付(交付[]deliObj){
this.deliObj=deliObj;
}
公共交付[]获取交付(){
返回此文件。deliObj;
}
公共静态void main(字符串[]args){
Schedule scheduleObj=新计划();
scheduleObj.run();
}
公开募捐{
System.out.println(“\n****主传送控制台******\n”);
系统输出打印(“A)dd交付”);
System.out.println(“D)删除交付);
系统输出打印(L)列表交付);
System.out.println(“E)xit”);
char selection=Character.toUpperCase(UserInput.getChar());
开关(选择){
案例“A”:addDelivery();
打破
案例“D”:deleteDelivery();
打破
案例“L”:listDelivery();
打破
案例“E”:系统出口(0);
}
}
公共交付(){
交付getInputDelivery=新交付();
getInputDelivery.InputDelivery();
deliObj[count]=getInputDelivery;
计数++;
插入交付(getInputDelivery);
run();
}
公共交付(){
System.out.println(“请输入要删除的号码:”);
intnum=UserInput.getInt(0,count);
//deliObj[num-1]=新交付();
deliObj[num-1]=null;
计数--;
run();
}
公共服务交付(){
对于(int i=0;i通常不能将元素插入数组中。数组是固定长度的(它们正好包含n
元素,并且不能将数组更改为包含n+1
或n-1
元素)。您可以创建一个新数组,该数组具有容纳n+1
元素的空间,并将元素从原始数组复制到新数组中,在创建新元素时将新元素插入正确的位置。您还可以创建一个太大的数组,以防获得更多元素(看起来像您所做的那样)然后开始向上移动元素
这听起来像是一个家庭作业问题。你能问某人(实验室助手、导师、合作学生)你的想法是否正确吗?要求“我不允许使用数组以外的任何东西”和插入的需要似乎不一致。我先假设“数组以外的任何东西”不扩展到实用程序类,如java.util.Arrays
。如果扩展了,您将需要实现一些我在自己下面使用的方法
第一步是使您的交付
实现可比
,或者创建一个实现比较器
的新类。这定义了交付
对象的顺序。此更改应该很简单,因为您已经定义了可比交付
方法
通过此修改,您可以通过调用Arrays.binarySearch(deliObj,temp)
来获取插入值的索引。如果不允许使用Arrays
类,请展示一个简单的二进制搜索实现
您可能正在查找。返回:搜索键的索引,如果它包含在数组中;否则,((插入点)-1)。我可以,这是我明天要做的,但遗憾的是,我询问的少数人已经不愿意提供模糊的“建议”之外的帮助我问的助教也是这样,好像我应该知道我所在班级的b/c。这真的很糟糕。要求是20个元素的数组,但默认只输入4个元素,然后可以添加/删除到20个限制。我同意这是不一致的,这就是为什么我有这么多困难。感谢quick reply表示在“Delivery”类中实现我的“compareDelivery()”有很多困惑。我是否应该在“insertDelivery()过程中调用“compareDelivery()”“?还有,我如何找到‘binarySearch’返回的索引?一旦我找到了,我就如何交换它,当然是交换正确的索引?我认为这需要完全改变数组…@Camdeazy我对交付中的compare
方法的意思是你应该更改类声明对于Delivery
topublic类Delivery实现了Comparable
,然后在类的主体中添加一个方法public int compare(Delivery d)
,该方法包含与compareDelivery
方法相同的逻辑。这允许您
package project1;
import UserInput.UserInput;
public class Delivery {
private static final String FINAL_MONTH[] = {"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"};
private String month;
private int day;
private int hour;
private int minute;
private int second;
private String userMessage;
public static int integerMonth(String compareMonth){
for(int i = 0; i < FINAL_MONTH.length; i++){
if(compareMonth.equals(FINAL_MONTH[i])){
return i;
}
}
return -1;
}
public Delivery(String month, int day, int hour, int minute, String userMessage) {
this.month = month;
this.day = day;
this.hour = hour;
this.minute = minute;
this.userMessage = userMessage;
}
public void setMonth(String month) {
for (String FINAL_MONTH1 : FINAL_MONTH) {
if (month.equalsIgnoreCase(FINAL_MONTH1)) {
this.month = month.toUpperCase();
}
}
}
public String getMonth() {
return this.month;
}
public void setDay(int day) {
this.day = day;
}
public int getDay() {
return this.day;
}
public void setHour(int hour) {
this.hour = hour;
}
public int getHour() {
return this.hour;
}
public void setMinute(int minute) {
this.minute = minute;
}
public int getMintute() {
return this.minute;
}
public void setSecond(int second) {
this.second = second;
}
public int getSecond() {
return this.second;
}
public void setUserMessage(String userMessage) {
this.userMessage = userMessage;
}
public String getUserMessage() {
return this.userMessage;
}
public Delivery() {
month = "JAN";
day = 1;
hour = 12;
minute = 00;
userMessage = "default";
}
@Override
public String toString() {
String data = String.format(month + " %02d, " + "%02d:" + "%02d " + userMessage, day, hour, minute);
return data;
}
public void InputDelivery() {
System.out.println("Enter month of delivery(3 letter abbreviation): ");
setMonth(UserInput.getString(3, 3));
System.out.println("Enter day of delivery: ");
setDay(UserInput.getInt(0, 31));
System.out.println("Enter hour of delivery (0-23): ");
setHour(UserInput.getInt(0, 24));
System.out.println("Enter minute of delivery (0-59): ");
setMinute(UserInput.getInt(0, 59));
System.out.println("Enter message for delivery (40 Character Max): ");
setUserMessage(UserInput.getString(0,40));
System.out.println(toString());
}
}
1 int[] data;
2 int size;
3
4 public boolean binarySearch(int key)
5 {
6 int low = 0;
7 int high = size - 1;
8
9 while(high >= low) {
10 int middle = (low + high) / 2;
11 if(data[middle] == key) {
12 return true;
13 }
14 if(data[middle] < key) {
15 low = middle + 1;
16 }
17 if(data[middle] > key) {
18 high = middle - 1;
19 }
20 }
21 return false;
22 }
public static int[] addPos(int[] a, int pos, int num) {
int[] result = new int[a.length];
for(int i = 0; i < pos; i++)
result[i] = a[i];
result[pos] = num;
for(int i = pos + 1; i < a.length; i++)
result[i] = a[i - 1];
return result;
}