在 Java 中不使用排序算法将对象元素插入数组中的有序位置
Insert object element into array in ordered position, without using sort algorithm in Java
我有一个编程项目几乎 完成了,但我正在努力将控制台创建的新对象插入数组的正确位置。
我可以制作对象,在开头或结尾插入,删除对象等,但数组需要按顺序排列(月、日、时间),我被卡住了。
找了半天,论坛、资讯网站、书籍等都找不到答案。
P.S。我不允许使用数组以外的任何东西(ArrayList、LinkedList 等),而且我不能使用任何排序算法(冒泡排序、插入排序等)
指示特别要求我根据需要移动数组元素并将新对象放在 between/at 正确位置。我也在使用 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];
}
} */
}
}
这是我的主要 class,其中 运行,但这是另一个具有构造函数和 getters/setters 等的子class
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());
}
}
我真的需要 insertDelivery() 方法方面的帮助,如果您看到其他错误,您可以提出来,但请尝试就这部分向我提供建议!
通常您不能插入一个元素到数组中。数组是固定长度的(它们恰好包含 n
个元素,您不能更改数组以包含 n+1
或 n-1
个元素)。您可以做的是为 n+1
元素创建一个包含 space 的新数组,并将元素从原始数组复制到新数组中,并在创建新元素时将其插入正确的位置。您也可以将它创建得太大,以期获得更多元素(看起来像您所做的那样),然后开始向上移动元素。
这听起来像是一道家庭作业题。如果你有正确的想法,你能问一个人(实验室助手、导师、共同学生)吗?要求 "I am NOT allowed to use anything other than an array" 和插入的需要似乎不一致。
我首先假设 "anything other than an array" 不会扩展到实用程序 class,例如 java.util.Arrays
。如果是这样,您将需要实现一些我在您自己下面使用的方法。
第一步是让您的 Delivery
实现 Comparable<Delivery>
或创建一个新的 class 来实现 Comparator<Delivery>
。这定义了 Delivery
对象的顺序。此更改应该很简单,因为您已经定义了一个 compareDelivery
方法。
进行此修改后,您可以通过调用Arrays.binarySearch(deliObj,temp)
获取插入值的索引。如果不允许您使用 Arrays
class,this link 显示一个简单的二进制搜索实现。
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 }
有了这个索引,您现在需要在此时插入您的对象。然而,使用数组,这比看起来稍微困难一些。数组的长度是不可变的,因此您必须在插入对象之前创建一个比当前数组长一个元素的新数组。您将在 ArrayList
或 less.Inserting 中执行幕后发生的操作,之前在 Whosebug 上已经介绍过数组中的元素,因此我将只向您介绍 a helpful answer。
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;
}
我有一个编程项目几乎 完成了,但我正在努力将控制台创建的新对象插入数组的正确位置。
我可以制作对象,在开头或结尾插入,删除对象等,但数组需要按顺序排列(月、日、时间),我被卡住了。
找了半天,论坛、资讯网站、书籍等都找不到答案。
P.S。我不允许使用数组以外的任何东西(ArrayList、LinkedList 等),而且我不能使用任何排序算法(冒泡排序、插入排序等)
指示特别要求我根据需要移动数组元素并将新对象放在 between/at 正确位置。我也在使用 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];
}
} */
}
}
这是我的主要 class,其中 运行,但这是另一个具有构造函数和 getters/setters 等的子class
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());
}
}
我真的需要 insertDelivery() 方法方面的帮助,如果您看到其他错误,您可以提出来,但请尝试就这部分向我提供建议!
通常您不能插入一个元素到数组中。数组是固定长度的(它们恰好包含 n
个元素,您不能更改数组以包含 n+1
或 n-1
个元素)。您可以做的是为 n+1
元素创建一个包含 space 的新数组,并将元素从原始数组复制到新数组中,并在创建新元素时将其插入正确的位置。您也可以将它创建得太大,以期获得更多元素(看起来像您所做的那样),然后开始向上移动元素。
这听起来像是一道家庭作业题。如果你有正确的想法,你能问一个人(实验室助手、导师、共同学生)吗?要求 "I am NOT allowed to use anything other than an array" 和插入的需要似乎不一致。
我首先假设 "anything other than an array" 不会扩展到实用程序 class,例如 java.util.Arrays
。如果是这样,您将需要实现一些我在您自己下面使用的方法。
第一步是让您的 Delivery
实现 Comparable<Delivery>
或创建一个新的 class 来实现 Comparator<Delivery>
。这定义了 Delivery
对象的顺序。此更改应该很简单,因为您已经定义了一个 compareDelivery
方法。
进行此修改后,您可以通过调用Arrays.binarySearch(deliObj,temp)
获取插入值的索引。如果不允许您使用 Arrays
class,this link 显示一个简单的二进制搜索实现。
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 }
有了这个索引,您现在需要在此时插入您的对象。然而,使用数组,这比看起来稍微困难一些。数组的长度是不可变的,因此您必须在插入对象之前创建一个比当前数组长一个元素的新数组。您将在 ArrayList
或 less.Inserting 中执行幕后发生的操作,之前在 Whosebug 上已经介绍过数组中的元素,因此我将只向您介绍 a helpful answer。
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; }