TreeSet не работает должным образом - PullRequest
0 голосов
/ 02 июля 2010

Вывод не сортируется в порядке возрастания.Вот код и вывод, который я получаю.

Фактический вывод:

Amy Jose Jeremy Alice Patrick 
Alan Amy Jeremy Helen Alexi

Хотя ожидаемый вывод:

Amy, Alice, Jeremy, jose, Patrick
Alan, Amy, Alexi, Helen, Jeremy

Код:

public class MyFriends
{
   static Set<String> names = new TreeSet<String>();

  public MyFriends()
   {
      super();
      names = new TreeSet<String>();
   }

  public static void exampleMethod()
   {
     String[] name1 = {"Amy", "Jose", "Jeremy", "Alice", "Patrick"};
     String[] name2 = { "Alan", "Amy", "Jeremy", "Helen", "Alexi"};

     for (int i = 0; i < name1.length; i++)
     {
         names.add(name1[i]);
     }

     for (String aString : name1)
     {
       System.out.print(" " + aString);
     }

     for (int i = 0; i < name2.length; i++)
     {
        names.add(name2[i]);
     }

     for (String bString : name2)
     {
       System.out.print(" " + bString); 
     }

   }    

Ответы [ 3 ]

5 голосов
/ 02 июля 2010

В настоящее время вы просто снова записываете массивы ... добавление содержимого массива в TreeSet не приведет к изменению массива.

Вместо двух блоков, записывающихмассивы, у вас должен быть один, в конце:

for (String name : names)
{
    System.out.print(" " + name); 
}

Если вы на самом деле хотите две строки вывода, вы должны использовать два TreeSet экземпляра.* Если вы хотите отсортировать массивы, вы должны просто отсортировать их на месте.Когда вы добавляете значение к TreeSet, оно не знает и не заботится о том, откуда оно взято.Это просто ссылка на строковый объект (в данном случае).

1 голос
/ 02 июля 2010

Я бы переписал это как:

public class MyFriends
{
   // I just changed the name for testing purtposes
   public static void main(final String[] argv)
   {
       final Set<String> names = new TreeSet<String>();
       final String[] name1 = {"Amy", "Jose", "Jeremy", "Alice", "Patrick"};
       final String[] name2 = { "Alan", "Amy", "Jeremy", "Helen", "Alexi"};

       add(name1, names);
       display(names);

       // you wanted to display each array separately right, not the total of all names in both 
       // arrays
       names.clear();

       add(name2, names);
       display(names);
    }

    private static void add(final String[]    namesToAdd,
                            final Set<String> names)
    {
       for(final String name : namesToAdd)
       {
           names.add(name);
       }
    }

    private static void display(final Set<String> names)
    {
       for(final String name : names)
       {
           System.out.print(" " + name);
       }

       System.out.println();
    }
}

Это позволяет избежать проблемы, когда вы передаете неправильную переменную (как указывает Джон в своем ответе), потому что передача неправильной вещи вызовет ошибку времени компиляции,

Также неплохо создать методы для повторения кода - код любит иметь имена, и вы присваиваете кусок кода имени, помещая его в метод.

РЕДАКТИРОВАТЬ: Вне отставая от ответа от Джона :-) вот способ, которым я действительно сделал бы это, с двумя наборами:

public class Main
{
    // I just changed the name for testing purtposes
    public static void main(final String[] argv)
    {
        final Set<String> namesSet1;
        final Set<String> namesSet2;
        final String[] nameArray1 =
        {
            "Amy",
            "Jose",
            "Jeremy",
            "Alice",
            "Patrick"
        };
        final String[] nameArray2 =
        {
            "Alan",
            "Amy",
            "Jeremy",
            "Helen",
            "Alexi"
        };

        namesSet1 = makeSet(nameArray1);
        display(namesSet1);

        namesSet2 = makeSet(nameArray2);
        display(namesSet2);
    }

    private static Set<String> makeSet(final String[] namesToAdd)
    {
        final Set<String> names;

        names = new TreeSet<String>();

        for(final String name : namesToAdd)
        {
            names.add(name);
        }

        return (names);
    }

    private static void display(final Set<String> names)
    {
        for(final String name : names)
        {
            System.out.print(" " + name);
        }

        System.out.println();
    }
}
0 голосов
/ 02 июля 2010

Вам нужно будет передать свой TreeSet специальный Comparator, чтобы получить этот порядок:

Amy, Alice, Jeremy, jose, Patrick
Alan, Amy, Alexi, Helen, Jeremy

Во-первых, Алиса и Алекси идут перед Эми в алфавитном порядке.Кроме того, jose следует за Патриком, потому что он начинается со строчной буквы (используйте Comparator.CASE_INSENSITIVE_ORDER или Collator, если вы хотите игнорировать регистр при заказе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...