Во-первых - сделайте что-нибудь с вашими соглашениями об именах.
У вас есть два класса с таким же названием MyList
(один - public
, один - Inner
). Вот почему я предлагаю изменение названия Inners
класса к MyListElement
:
private class MyListElement
{
private final Integer value;
private MyListElement nextElement;
private MyListElement(final Integer value)
{
this.value = value;
}
}
Нет больше nextn
или num
. Элементы списка имеют values
и nextElements
. Также - их values
- final
(изменить нельзя). Не более start
, op
, found
, aux
и так далее. Эти имена означают **** и не помогают, и испорчают код.
Второе - не делайте все в основном методе.
Плохая практика. Это заставляет вас использовать static
fields
и methods
. Создание объекта в main
method
и пусть этот объект сделать работу для вас:
public class MyList
{
private Scanner userInput;
private Integer selectedOption;
private MyListElement firstElement = null;
private boolean exitRequested = false;
public static void main(final String[] args)
{
MyList myList = new MyList(new Scanner(System.in));
myList.run();
}
private MyList(final Scanner userInput)
{
this.userInput = userInput;
}
//other methods and classes
}
В-третье - как следует вашему код работать?
Как можно проще. Тем не менее:
public void run()
{
do
{
promptUserForOperation();
processSelectedOperation();
} while(!exitRequested);
}
Прост достаточно?
В-четвертых, вы знаете, как запросить. Как обрабатывать?
Снова - как можно проще. Тем не менее:
private void processSelectedOption()
{
switch (selectedOption)
{
case 1:
case 2:
{
addNewElement();
} break;
case 3:
{
printList();
} break;
case 4:
{
removeElement();
} break;
case 5:
{
clearList();
} break;
case 6:
{
exit();
} break;
default:
{
printWrongOperationSelected();
}
}
}
И наконец - как отсортировать?
private void addNewElement()
{
//getting the input
System.out.print("Please type the number to be added to the list: ");
Integer newValue = null;
while(newValue == null)
{
try
{
newValue = Integer.parseInt(userInput.nextLine());
}
catch (final Exception e)
{
System.out.println("Wrong value. Please insert new value.");
}
}
//creating new element based on the input
MyListElement newElement = new MyListElement(newValue);
//if not first
if (firstElement != null)
{
placeElementInList(newElement);
}
else
{
firstElement = newElement; //if first
}
}
//if not first
private void placeElementInList(final MyListElement newElement)
{
//if smaller than first
if (newElement.value < firstElement.value)
{
newElement.nextElement = firstElement; //new points to first
firstElement = newElement; //and becomes first
}
else
{
MyListElement previousElement = firstElement; //have to remember previous element
MyListElement elementInList = firstElement.nextElement; //currently checked.
while (elementInList != null)
{
if (newElement.value < elementInList.value) //if new element is smaller that currently checked
{
break; //break - put it in current position.
}
previousElement = elementInList; //if not, move forward, substitute variables
elementInList = elementInList.nextElement;
}
previousElement.nextElement = newElement; //set the new element at the proper position
newElement.nextElement = elementInList; //
}
}
Средство удаления method
почти то же самое. И все.
Вы можете это сделать, используя способ сортировки, но я бы посоветовал как можно скорее изучить хорошие habbits. И это правильно называет ваши классы/методы/поля/переменные (они не должны быть короткими, используйте ctrl + space) и фрагментируйте код до мельчайших частей. Имейте в виду, что вышеупомянутый код далеко не идеален - многое можно улучшить.
SPOILER
Всего (рабочий) Код:
package test;
import java.util.Scanner;
public class MyList
{
private Scanner userInput;
private Integer selectedOption;
private MyListElement firstElement = null;
private boolean exitRequested = false;
public static void main(final String[] args)
{
new MyList(new Scanner(System.in)).run();
}
private MyList(final Scanner userInput)
{
this.userInput = userInput;
}
public void run()
{
do
{
promptUserForOption();
processSelectedOption();
} while(!exitRequested);
}
private void promptUserForOption()
{
System.out.println("");
System.out.println("1 - insert number in the beginning list");
System.out.println("2 - insert in the end of the list");
System.out.println("3 - query list");
System.out.println("4 - remove from list");
System.out.println("5 - empty list");
System.out.println("6 - exit");
System.out.print("Please choose option: ");
try
{
selectedOption = Integer.parseInt(userInput.nextLine());
}
catch (final Exception e)
{
printWrongOperationSelected();
selectedOption = -1;
}
}
private void printWrongOperationSelected()
{
System.out.println("Wrong operation selected.");
}
private void processSelectedOption()
{
switch (selectedOption)
{
case 1:
case 2:
{
addNewElement();
} break;
case 3:
{
printList();
} break;
case 4:
{
removeElement();
} break;
case 5:
{
clearList();
} break;
case 6:
{
exit();
} break;
default:
{
printWrongOperationSelected();
}
}
}
private void addNewElement()
{
System.out.print("Please type the number to be added to the list: ");
Integer newValue = null;
while(newValue == null)
{
try
{
newValue = Integer.parseInt(userInput.nextLine());
}
catch (final Exception e)
{
System.out.println("Wrong value. Please insert new value.");
}
}
MyListElement newElement = new MyListElement(newValue);
if (firstElement != null)
{
placeElementInList(newElement);
}
else
{
firstElement = newElement;
}
}
private void placeElementInList(final MyListElement newElement)
{
if (newElement.value < firstElement.value)
{
newElement.nextElement = firstElement;
firstElement = newElement;
}
else
{
MyListElement previousElement = firstElement;
MyListElement elementInList = firstElement.nextElement;
while (elementInList != null)
{
if (newElement.value < elementInList.value)
{
break;
}
previousElement = elementInList;
elementInList = elementInList.nextElement;
}
previousElement.nextElement = newElement;
newElement.nextElement = elementInList;
}
}
private void printList()
{
if (firstElement == null)
{
System.out.println("No elements in the list.");
}
else
{
MyListElement elementInList = firstElement;
while (elementInList != null)
{
System.out.print(elementInList.value + ", ");
elementInList = elementInList.nextElement;
}
System.out.println("");
}
}
private void removeElement()
{
System.out.print("Please type the number to be removed from the list: ");
Integer valueToRemove = null;
while(valueToRemove == null)
{
try
{
valueToRemove = Integer.parseInt(userInput.nextLine());
}
catch (final Exception e)
{
System.out.println("Wrong value. Please insert value to remove.");
}
}
if (firstElement == null)
{
System.out.println("No elements in the list. None can be removed.");
}
else
{
boolean found = false;
if (firstElement.value.equals(valueToRemove))
{
firstElement = firstElement.nextElement;
found = true;
}
else
{
MyListElement previousElement = firstElement;
MyListElement elementInList = firstElement.nextElement;
while (elementInList != null)
{
if (elementInList.value.equals(valueToRemove))
{
previousElement.nextElement = elementInList.nextElement;
found = true;
break;
}
previousElement = elementInList;
elementInList = elementInList.nextElement;
}
}
if (!found)
{
System.out.println("Value " + valueToRemove + " is not in the list.");
return;
}
else
{
System.out.println("Value removed.");
}
}
}
private void clearList()
{
firstElement = null;
}
private void exit()
{
exitRequested = true;
}
private class MyListElement
{
private final Integer value;
private MyListElement nextElement;
private MyListElement(final Integer value)
{
this.value = value;
}
}
}
EDIT (с телефона)
private void printInReverse()
{
MyListElement tmpElement=firstElement;
MyListElement previousElement=tmpElement.nextElement;
while (previousElement!=null)
{
previousElement.nextElement=tmpElement;
tmpElement =previousElement;
previousElement=previousElenent.nextElement;
}
MyListElement firstReverseElement=tmpElement;
//loop like in the normal print loop but using firstReverseElement as starting point. You can create print methodthat would take First element as param.
}
EDIT - REVERSE ПОРЯДОК COMPLETE:
private void printList()
{
printListFromElement(firstElement);
}
private void printListFromElement(final MyListElement firstElementToPrint)
{
if (firstElementToPrint == null)
{
System.out.println("No elements in the list.");
}
else
{
MyListElement elementInList = firstElementToPrint;
while (elementInList != null)
{
System.out.print(elementInList.value + ", ");
elementInList = elementInList.nextElement;
}
System.out.println("");
}
}
private void printListInReverse()
{
if (firstElement == null)
{
System.out.println("No elements in the list.");
}
else
{
MyListElement fistElementInReverse = new MyListElement(firstElement.value);
MyListElement previousElement;
MyListElement elementInOriginalList = firstElement;
while (elementInOriginalList.nextElement != null)
{
previousElement = fistElementInReverse;
fistElementInReverse = new MyListElement(elementInOriginalList.nextElement.value);
fistElementInReverse.nextElement = previousElement;
elementInOriginalList = elementInOriginalList.nextElement;
}
printListFromElement(fistElementInReverse);
}
}
Здесь, в реверсивном цикле, вы должны создать новые объекты MyListElementObjects. Вы получаете бесконечный цикл/разрыв исходного списка/получите нулевой указатель, если вы этого не сделаете, поскольку вы только изменяете ссылки в исходном списке.
Java не предоставляет вам возможность играть с указателями *, такими как C/C++. И самая большая проблема, которую я нахожу здесь, заключается в том, что ваш внутренний класс имеет то же имя, что и ваш топ-класс, что делает ваш код действительно беспорядочным. –
@LuiggiMendoza, я думаю, что указатель, на который он ссылается, является гипотетическим указателем, указывающим текущее значение в цикле сортировки (просто предположение). – br3nt
@ user3816423, пытаетесь ли вы реализовать связанный список? Можете ли вы уточнить, в какой части вашего кода вы боретесь? – br3nt