首先 - 用你的命名約定做些事情。
您有兩個同名的班級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
幾乎是相同的。 就是這樣。
你可以做到這一點 - 使用提出的排序方法 - 但我建議儘快學習良好的習慣。這就是正確地命名你的類/方法/字段/變量(它們不必是簡短的,使用ctrl +空格),並將代碼分解成儘可能最小的部分。注意上面的代碼遠沒有完美 - 可以改進很多。
擾流
全(工作)代碼:
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.
}
編輯 - 反向順序完成:
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++一樣的*指針*。我在這裏發現的最大問題是,你的內部類與你的頂級類有相同的名字,這會讓你的代碼變得非常混亂。 – 2014-09-05 01:03:02
@LuiggiMendoza,我認爲他指的是一個假指針,指示排序循環中的當前值(只是一個猜測)。 – br3nt 2014-09-05 01:07:49
@ user3816423,你想要實現一個鏈表嗎?你能澄清你的代碼中哪一部分與你一起掙扎嗎? – br3nt 2014-09-05 01:18:19