亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 按順序插入數字到數組中

Java 按順序插入數字到數組中

湖上湖 2023-09-06 15:45:11
我在完成作業時遇到問題。我對編碼相當陌生,并且很難弄清楚如何做到這一點。我的教授提供了從數組中添加和刪除項目的代碼,但他希望我們添加一個方法,將項目添加到數組的正確位置。這是提供的代碼:import java.util.*;public class MyArrayList {private Object[]buffer;private int currentSize;public MyArrayList(){   final int INITIAL_SIZE=10;  buffer = new Object[INITIAL_SIZE];  currentSize=0;  }public int size() {  return currentSize;  }private void checkBounds(int n){  if (n<0||n>= currentSize){     throw new IndexOutOfBoundsException();     }  }public Object get (int pos){  checkBounds(pos);  return buffer[pos];  }public Object remove(int pos){  checkBounds(pos);  Object removed = buffer[pos];  for (int i = pos+1; i < currentSize; i++){     buffer[i-1] = buffer[i];  }  currentSize--;  return removed;}public boolean add(int pos, Object newElement){  growBufferIfNecessary();  currentSize++;  checkBounds(pos);  for(int i = currentSize - 1; i > pos; i--){     buffer[i] = buffer [i-1];  }  buffer[pos] = newElement;  return true;}public boolean addLast(Object newElement){  growBufferIfNecessary();  currentSize++;  buffer[currentSize -1] = newElement;  return true;} private void growBufferIfNecessary(){  if (currentSize==buffer.length){     Object[] newBuffer = new Object[2*buffer.length];     for(int i=0; i<buffer.length; i++){     newBuffer[i] = buffer[i];     }  buffer = newBuffer;   }} }這是我們的任務:添加一個名為“public void insert(int n)”的方法,該方法會將 n 添加到 MyArrayList 對象中保持排序順序的正確位置。使用現有的 MyArrayList 類并進行必要的修改。這是一個測試用例:MyArrayList 列表 = new MyArrayLst();列表.插入(5); 插入(10);插入(8);插入(20);插入(6);如果您現在打印列表,它應該打印為:5681020這就是到目前為止我的主要方法中的內容: import java.util.*; public class ArrayListHomework { public static void main (String[]args){ MyArrayList list = new MyArrayList(); list.insert(5); list.insert(10); list.insert(8); list.insert(20); list.insert(6); for (int i=0; i<list.size(); i++){     System.out.println(list.get(i));   }  }   }我非常不知道如何啟動這個插入方法。任何幫助,將不勝感激。謝謝。
查看完整描述

2 回答

?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

可悲的是,不可原諒的是,你的“教授”提供的代碼在add()方法中存在一個錯誤,如下:

public?boolean?add(int?pos,?Object?newElement){
????growBufferIfNecessary();
????currentSize++;
????checkBounds(pos);?
???????//?rest?of?method

因為checkBounds()不是首先調用,所以如果pos超出范圍,currentSize將增加(并且緩沖區不必要地增長),使實例處于不一致/錯誤狀態。

編碼101:首先檢查參數。

修理:

public?boolean?add(int?pos,?Object?newElement){
????checkBounds(pos);
????growBufferIfNecessary();
????currentSize++;
????????//?rest?of?method

要回答您的問題,您必須實現所謂的插入排序。簡而言之,這意味著使用循環迭代所有元素,并在遇到更大元素或到達元素末尾時插入新元素。

請注意,如果您的數組元素尚未排序,則調用insert()毫無意義。要處理這種情況,您應該考慮拋出IllegalStateExceptionif 元素無序(您可以在迭代時檢查前一個元素是否不大于當前元素)。


查看完整回答
反對 回復 2023-09-06
?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

不完全像插入排序,因為有空值的空閑空間


public void insert( int n ) {

  growBufferIfNecessary();

  for( int i = 0; i < buffer.length; i++ ) {

    if( buffer[i] == null ) {

      buffer[i] = n; currentSize++;

      break;

    }

    else if( buffer[i + 1] != null ) {

      int n1 = ((Number)buffer[i]).intValue();

      int n2 = ((Number)buffer[i + 1]).intValue();

      if( n1 < n && n2 > n ) {

        System.arraycopy( buffer, i + 1, buffer, i + 2, currentSize - i - 1 );  // line 1

        buffer[i + 1] = n; currentSize++;  // line 2

        break;

      }

    }

  }

}

該add()函數可以替換第 1 行和第 2 行


查看完整回答
反對 回復 2023-09-06
?
慕田峪4524236

TA貢獻1875條經驗 獲得超5個贊

感謝大家的幫助和建議。我通過使用 Marco13 建議的代碼讓它工作: https: //codereview.stackexchange.com/questions/36221/binary-search-for-inserting-in-array#answer-36239 希望每個人都有美好的一天并快樂編程。-TJ



查看完整回答
反對 回復 2023-09-06
  • 2 回答
  • 0 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號