2014-09-05 53 views
-1

我應該訂購插入到此清單中的數字。我也必須向後訂購它。在過去的幾個小時裏,我一直在努力做到這一點,但我還沒有拿出任何東西。我是初學者,對我來說最難的部分是使用它的指針命令。使用指針訂購清單

public class MyList { 

    private static class MyList 
    { 
     public int num; 
     public MyList nextn; 
    } 

    public static void main(String[] args) 
    { 
     Scanner input = new Scanner(System.in); 
     MyList start = null; 
     MyList end = null; 
     MyList aux; 
     MyList before; 
     int op, number, found; 
     do{ 
      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("choose: "); 
      op = input.nextInt(); 
      if(op < 1||op>6) 
      { 
       System.out.println("invalid number"); 
      } 
      if(op == 1) 
      { 
       System.out.println("type the number to be inserted in the beginning of the list"); 
       MyList newl = new MyList(); 
       newl.num = input.nextInt(); 
       if(start == null) 
       { 
        start = newl; 
        end = newl; 
        newl.nextn = null; 
       } 
       else 
       { 
        newl.nextn = start; 
        start = newl; 
       } 
       System.out.println("number inserted"); 
      } 
      if(op == 2) 
      { 
       System.out.println("type the number to be inserted in the end of the list"); 
       MyList newl = new MyList(); 
       newl.num = input.nextInt(); 
       if(start == null) 
       { 
        start = newl; 
        end = newl; 
        newl.nextn = null; 
       } 
       else 
       { 
        end.nextn = newl; 
        end = newl; 
        newl.nextn = null; 
       } 
       System.out.println("number inserted"); 
      } 
      if(op == 3) 
      { 
       if(start == null) 
       { 
        System.out.println("list is empty"); 
       } 
       else 
       { System.out.println("\nquerying the list\n"); 
        aux = start; 
        while(aux!=null) 
        { 
         System.out.print(aux.num+ " "); 
         aux = aux.nextn; 

        } 
       } 
      } 
      if(op == 4) 
      { 
       if(start == null) 
       { 
        System.out.println("list is empty"); 
       } 
       else 
       { 
        System.out.println("\ntype the number to be removed:\n"); 
        number = input.nextInt(); 
        aux = start; 
        before = null; 
        found = 0; 

        while(aux!=null) 
        { 
         if(aux.num == number) 
         { 
          found = found +1; 
          if(aux == start) 
          { 
           start = aux.nextn; 
           aux = start; 
          } 
          else if(aux == end) 
          { 
           before.nextn = null; 
           end = before; 
           aux = null; 
          } 
          else 
          { 
           before.nextn =aux.nextn; 
           aux = aux.nextn; 
          } 
         } 
         else 
         { 
          before = aux; 
          aux =aux.nextn; 
         } 
        } 
        if(found ==0) { 
         System.out.append("number not found"); 
        } 
        else if(found ==1) 
        { 
         System.out.append("number removed once!"); 
        } 
        else 
        { 
         System.out.append("number removed "+found+" times!"); 
        } 
       } 
      } 
      if(op == 5) 
      { 
       if(start == null) 
       { 
        System.out.println("empty list"); 
       } 
       else 
       { 
        start = null; 
        System.out.println("emptied list"); 
       } 
      } 
     } while(op !=6); 
    } 
+0

Java不提供像C/C++一樣的*指針*。我在這裏發現的最大問題是,你的內部類與你的頂級類有相同的名字,這會讓你的代碼變得非常混亂。 – 2014-09-05 01:03:02

+0

@LuiggiMendoza,我認爲他指的是一個假指針,指示排序循環中的當前值(只是一個猜測)。 – br3nt 2014-09-05 01:07:49

+0

@ user3816423,你想要實現一個鏈表嗎?你能澄清你的代碼中哪一部分與你一起掙扎嗎? – br3nt 2014-09-05 01:18:19

回答

2

首先 - 用你的命名約定做些事情。

您有兩個同名的班級MyList(其中一個是public,一個是Inner)。這就是爲什麼我建議改變Inners類名MyListElement

private class MyListElement 
{ 
    private final Integer value; 
    private MyListElement nextElement; 

    private MyListElement(final Integer value) 
    { 
     this.value = value; 
    } 
} 

沒有更多nextnnum。列表元素有valuesnextElements。另外 - 他們valuesfinal(不能更改)。沒有更多start,op,found,aux等等。這些名字的意思是****,並沒有幫助,並搞亂了代碼。

第二 - 不要在主要方法中做所有事情。

這是不好的做法。它強制您使用staticfieldsmethods。創建mainmethod一個對象,並讓該對象做的工作適合你:

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。如果您不這樣做,您將獲得無限循環/中斷原始列表/獲取空指針,因爲您只更改原始列表中的引用。

+0

現在一切都更清晰。我很高興你想到將代碼分解成多種方法。我從來沒有實踐過這一點,我知道保持心智是一個好習慣。我怎麼能扭轉列表中的元素?假設列表包含「1,2,3」,但我想打印它「3,2,1」。我應該創建另一個列表來插入數字還是有辦法將其向後排序(減少)?萬分感謝。 @MichalSchielmann – user3816423 2014-09-05 16:52:47

+0

@ user3816423對不起,即時在節假日,只有ny電話與我,所以產生一個編譯的代碼不是100%可能;)一種方法是將另一個字段添加到內部類,這將被稱爲'以前'。這樣你可以遍歷這兩種方式。我沒有這樣做,因爲我不知道這是否允許。這樣你可以從頭到尾再回來。 – 2014-09-05 21:30:25

+0

其他的方法是創建一個循環,可能在New方法中。創建名爲lastElement的new myListElement並將firstElement賦值給它(按照倒序的順序)。然後創建newElement = currentElement.nextElement並執行newElement.nextElement = currentElement。 Tgis的方式,你會扭轉它。對不起,解釋不好,但這是我所能做的現在:( – 2014-09-05 21:38:51