2014-09-05 3 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++. И самая большая проблема, которую я нахожу здесь, заключается в том, что ваш внутренний класс имеет то же имя, что и ваш топ-класс, что делает ваш код действительно беспорядочным. –

+0

@LuiggiMendoza, я думаю, что указатель, на который он ссылается, является гипотетическим указателем, указывающим текущее значение в цикле сортировки (просто предположение). – br3nt

+0

@ user3816423, пытаетесь ли вы реализовать связанный список? Можете ли вы уточнить, в какой части вашего кода вы боретесь? – br3nt

ответ

2

Во-первых - сделайте что-нибудь с вашими соглашениями об именах.

У вас есть два класса с таким же названием 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 и так далее. Эти имена означают **** и не помогают, и испорчают код.

Второе - не делайте все в основном методе.

Плохая практика. Это заставляет вас использовать staticfields и methods. Создание объекта в 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 почти то же самое. И все.

Вы можете это сделать, используя способ сортировки, но я бы посоветовал как можно скорее изучить хорошие 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. Вы получаете бесконечный цикл/разрыв исходного списка/получите нулевой указатель, если вы этого не сделаете, поскольку вы только изменяете ссылки в исходном списке.

+0

Теперь все яснее. Я рад, что вы подумали о том, чтобы разбить код на методы. Я никогда не практиковал это, и я знаю, что это хорошая привычка держать ум. Как можно изменить элементы в списке? Скажем, список содержит «1, 2, 3», но я хочу напечатать его «3, 2, 1». Должен ли я создать другой список для вставки чисел или есть способ сортировать его назад (уменьшая)? Большое спасибо. @MichalSchielmann – user3816423

+0

@ user3816423 извините, im на праздниках сейчас, и у меня есть только телефон со мной, поэтому создание кода, который будет компилироваться, не может быть на 100%;) Один из способов - добавить другое поле во внутренний класс, и это будет вызвано «предыдущий». Таким образом, вы можете пройти в обоих направлениях. Я не сделал этого, потому что я не знал, разрешено ли это. Таким образом, вы можете начать собирать и возвращаться. –

+0

Другим способом было бы создать цикл, возможно, в методе New. Создайте новый myListElement, называемый lastElement, и присвойте firstElement этому (как в обратном порядке последнему). Затем создайте newElement = currentElement.nextElement и выполните newElement.nextElement = currentElement. Tgis, вы можете изменить его. Извините за плохое объяснение, но это все, что я могу сделать. Прямо сейчас :( –

Смежные вопросы