2016-01-04 2 views
0

Привет У меня есть этот код, который упорядочивает список строк в порядке, я также могу сортировать массив по возрастанию, так как есть много учебников, которые помогут мне. Проблема заключается в сортировке чисел с прикрепленными буквами. Это возможно? Вот что я до сих пор.Как получить отдельно связанный список для сортировки шестнадцатеричных чисел

import java.io.File; 
import java.io.IOException; 
import java.util.Scanner; 

public class LinkedList2 { 
public static class Node { 
    public String value; 
    public Node next; 
} 

static File dataInpt; 
static Scanner inFile; 

public static void main(String[] args) throws IOException { 
    inFile = new Scanner("20\r\n" + "38\r\n" + "5c\r\n" + "2b\r\n" + "54\r\n" + "63\r\n" + "53\r\n" + "43\r\n" + "40\r\n" 
      + "14\r\n" + "2a\r\n" + "42\r\n" + "63\r\n" + "63\r\n" + "5c\r\n" + "4c\r\n"); 
    Node first = insertInOrder(); 
    printList(first); 
} 

public static Node getNode(String element) { 
    Node temp = new Node(); 
    temp.value = element; 
    temp.next = null; 
    return temp; 
} 

public static void printList(Node head) { 
    Node ptr; // not pointing anywhere 
    for (ptr = head; ptr != null; ptr = ptr.next) { 
     System.out.println(ptr.value); 
    } 
    System.out.println(); 
} 

public static Node insertInOrder() { 
    Node current = getNode(inFile.next()); 
    Node first = current, last = current; 
    while (inFile.hasNext()) { 
     if (first != null && current.value.compareTo(first.value) < 0) { 
      current.next = first; 
      first = current; 
     } else if (last != null && current.value.compareTo(last.value) > 0) { 
      last.next = current; 
      last = current; 
     } else { 
      Node temp = first; 
      while (current.value.compareTo(temp.value) < 0) { 
       temp = temp.next; 
      } 
      current.next = temp.next; 
      temp.next = current; 
     } 
     current = getNode(inFile.next()); 
    } 
    return first; 
} 

}

ответ

1

Можно сортировать любой вид Comparable элементов.

Если вы используете значение String в качестве значения, оно будет сортироваться с использованием натурального порядка строк. Если вам нужна другая политика сравнения вы должны написать Comparator и использовать его для сравнения значений вместо сравнить их непосредственно

public static Node insertInOrder(Comparator<String> comparator) { 
    Node current = getNode(inFile.next()); 
    Node first = current, last = current; 
    while (inFile.hasNext()) { 
     if (first != null && comparator.compare(current.value, first.value) < 0) { 
      current.next = first; 
      first = current; 
     } else if (last != null && comparator.compare(current.value, last.value) > 0) { 
      last.next = current; 
      last = current; 
     } else { 
      Node temp = first; 
      while (comparator.compare(current.value, temp.value) < 0){ 
       temp = temp.next; 
      } 
      current.next = temp.next; 
      temp.next = current; 
     } 
     current = getNode(inFile.next()); 
    } 
    return first; 
} 
+0

Я попытался это, но получаю это исключение 'Исключение в потоке«главный»java.lang.RuntimeException: Uncompilable исходного код - ошибочный типа: LinkedList2.insertInOrder сим \t на LinkedList2.main (LinkedList2.java:29) Java Результат: 1 – user5743264

+0

Были проблемы с закрытием парантеса. Извините, я не пытался его скомпилировать. Попробуй еще раз. –

+0

Я все еще получаю исключение в строке 29, говоря, что метод insertInOrder в классе LinkedList2 не может применяться к заданным типам; требуется: Компаратор не найден: аргументы аргументов отсутствуют: фактические и формальные списки аргументов различаются по длине – user5743264

0

Я думаю, вам нужно хранить дополнительные данные int элемента данных, соответствующие String value используя ниже метод Integer класс,

public static int parseInt(String s,int radix) throws NumberFormatException 

где radix = 16. Затем вы можете отсортировать его как нормальное целое (основание 10).

Вы должны изменить свой Node класс иметь int вместо String

public static class Node { 
    public int value; 
    public Node next; 
} 

затем в вашем методе getNode(String element), вы выполняете HEX строки для int преобразования,

public static Node getNode(String element) { 
     Node temp = new Node(); 
     try{ 

temp.value = Integer.parseInt(element,16); 
}catch(NumberFormatException ex){ 
ex.printStackTrace(); 
} 
     temp.next = null; 
     return temp; 
    } 

Теперь вам отредактируйте свой метод insertInOrder() для сравнения как простых целых чисел,>, <, == etc вместо o е value.compareTo

+0

Как бы это реализовать? – user5743264

+0

Я пересмотрел свой ответ, чтобы показать, как это сделать. Вы можете следовать совету Давиде Лоренцо МАРИНО, чтобы написать отдельный компаратор, чтобы иметь более надежный код. Задавайте конкретные вопросы о своих попытках, если у вас возникнут какие-либо проблемы. –

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