Проблема с добавлением элемента в массив в упорядоченном наборе
У меня возникают проблемы при добавлении элемента в мой массив, его нужно упорядочить в порядке возрастания, и по какой-то причине я просто добавляю его, а он не упорядочивает.
Вот мой код:
public boolean add(AnyType x){
if(this.contains(x))
return false;
else if(this.isEmpty()){
items[theSize]=x;
theSize++;
return true;
}
else{
if( theSize == items.length )
this.grow();
//Here goes code for adding
/*AnyType[] newItems = (AnyType[]) new Comparable[items.length];
newItems = items;
for(int i=0;i<theSize;i++)
if(items[i].compareTo(x)>0){
newItems[i]=x;
newItems[i+1]=items[i];
for(int j=i+1;j<theSize;j++)
newItems[j]=items[i];
items = newItems;
theSize++;
return true;
}
//*/
items[theSize]=x; //*/
theSize++;
return true;
}
}
Метод не должен позволять элементу повторяться, поэтому, если вы попытаетесь добавить что-то, что уже есть, он должен вернуть false. Если массив пуст, просто добавьте к items[0], а затем я попытался создать новый массив, и как только вы найдете элемент, размер которого больше, чем тот, который я ввожу, скопируйте все в новый массив, добавьте новое значение и просто добавьте остальные, а затем сделать items = newItems;
но это не сработало. Я пытался пару часов, поэтому я просто решил обратиться за помощью. У меня есть класс SortedSet, определенный следующим образом:
public class SortedSet<AnyType extends Comparable> implements Set<AnyType>
{
private AnyType[] items;
private int theSize;
public SortedSet(){
theSize = 0;
items = (AnyType[]) new Comparable[5];
}
Я знаю, что есть другие способы сделать это, например, с помощью TreeMap, но это нужно сделать как массив.
Спасибо
3 ответа
Я не вижу, где вы пишете предыдущие значения?
Попробуйте что-то подобное в последнем случае.
theSize++;
AnyType[] newItems = new AnyType[theSize];
for(int i = 0; i < theSize-1; i++)
if(items[i].compareTo(x) > 0)
{
newItems[i] = x;
newItems[i + 1] = items[i];
for(int j = i + 2; j < theSize; j++)
newItems[j] = items[j-1];
items = newItems;
return true;
}
else
newItems[i] = items[i];
newItems[theSize-1] = x;
items = newItems;
return true;
Поскольку я уже кодировал его, чтобы убедиться, что он работает нормально, вот пример работы со строками. Я сосредоточился здесь только на правильном добавлении. Другие вопросы, важные для ФП, были опущены.
import java.util.Arrays;
public class OrderingAddTest
{
static int theSize = 0;
static String[] items = new String[theSize];
public static void main(String[] args)
{
add("a");
add("e");
add("d");
add("b");
add("c");
System.out.println(Arrays.toString(items)+"\n; items.length="+items.length);
}
private static boolean add(String x)
{
theSize++;
String[] newItems = new String[theSize];
for(int i = 0; i < theSize - 1; i++)
if(items[i].compareTo(x) > 0)
{
newItems[i] = x;
newItems[i + 1] = items[i];
for(int j = i + 2; j < theSize; j++)
newItems[j] = items[j - 1];
items = newItems;
return true;
}
else
newItems[i] = items[i];
newItems[theSize - 1] = x;
items = newItems;
return true;
}
}
Уже есть нативный класс Java, который имеет эти функции: java.util.TreeSet.
В множестве один и тот же элемент не может появляться дважды. Метод "add" возвращает логическое значение: true, если элемент был добавлен, и false, если он уже был в наборе.
TreeSet - это реализация "SortedSet", которая поддерживает порядок элементов. Ваши предметы должны только реализовать "Сопоставимые".
Ваши вещи имеют тот же размер, что и предметы, они должны быть размером +1
Я думаю, у вас есть проблема здесь
для (int j=i+ 1; j newItems[J]= пункты [I]; здесь j точно увеличивается, но для i операции увеличения не дается, поэтому всем новым элементам в этом цикле присваивается одно и то же значение РЕДАКТИРОВАТЬ: РЕДАКТИРОВАТЬ 2: Вы делаете неправильные вещи здесь, items = newItems; и предыдущий оператор присваивания (newItems=items) Вы не можете приравнять их, поскольку они не одинакового размера, вы можете сделать это, если вы используете указатель (использование указателей здесь значительно облегчит эту задачу) int i;
for(i=0; i < theSize+1 ; i++)
if(items[i].compareTo(x)>0){
newItems[i]=x;
for(;i<theSize + 1; i++)
newItems[i]=items[i-1];
: делай что дальше.