Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Сортировка a-Z


Автор: DEER 21.12.2009, 22:12
Всем привет!
Такой вот ламерский вопрос smile как так отсортировать массив строк?
проблема в том, что большие буквы имеют приоритет над маленькими. Как это победить, кроме как делать собственную таблицу??
Подскажите плиз smile

Автор: Kangaroo 21.12.2009, 22:44
Как-то так:
Код

String[] stringArr = new String[] {"test", "teeeest", "t1", "Test"};
        
        Arrays.sort(stringArr, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return s1.compareToIgnoreCase(s2);
            }
        });
        
        System.out.println(Arrays.toString(stringArr));

Автор: DEER 21.12.2009, 23:06
неа.
Он будет сортировать массив 
Код

aa bb Aa ee

так
Код

aa Aa bb ee

а надо так
Код

aa bb ee Aa


вобщем проблема у меня в том, что
Код

s1.compareTo(s2);

считает, что 'A' должна идти первее чем 'a'
со сравнением букв можно было было использовать таблицу, где описаны буквы и их индексы, конечно не лучшее решение, но работало бы. но тут строки. Если такой велосипед изобретать, то не похоже это на "тестовое задание"
в инете ничего не нашел... не понимает язык запросов разницу между большими и маленькими буквами....

Автор: dobrolub 21.12.2009, 23:36
если стринги с английскими только буквами то попробуй использовать для сортировки компаратор 
java.lang.String.CASE_INSENSITIVE_ORDER

Collections.sort(mystringarray, String.CASE_INSENSITIVE_ORDER);

если с русскими или другими, то посмотри на 

java.text.Collator.

Автор: DEER 21.12.2009, 23:42
спасибо. попробую! только латиница и цыфры

Автор: DEER 22.12.2009, 00:28
он ведет себя как и обычный компаратор 
Код

       Collections.sort(elements2, new Comparator<String>() {
               public int compare(String a, String b) {
                   return a.compareTo(b);
               }
           }
       );

результат A-Za-z

надо как то поменять a-zA-Z  smile 

Автор: Kangaroo 22.12.2009, 00:35
Цитата(DEER @  21.12.2009,  23:06 Найти цитируемый пост)
а надо так

Ага, точно.

Ну тогда сравнивай посимвольно. Можешь взять из Стринга метод и переделать его под свою задачу.

Автор: dobrolub 22.12.2009, 01:00
smile свой надо писать похоже... интересная задача.

Автор: DEER 22.12.2009, 09:32
Самое интересное - это маленький кусочек от задания на час  smile 
вопрос по ходу закрыт

Автор: 4EJIOBEK 22.12.2009, 10:29
хоть вопрос и закрыт, как подсказывал  dobrolub, лучше в таком случае использовать Collator

доки http://java.sun.com/j2se/1.5.0/docs/api/java/text/Collator.html
пример в конце статьи http://javagu.ru/portal/dt?last=false&provider=javaguru&ArticleId=GURU_ARTICLE_92913&SecID=GURU_SECTION_63111

Автор: DEER 22.12.2009, 14:13
Во какой  изврат получился. может кому пригодиться:
Код

    public void run(){
       for(int i=0; i<elems.length; i++) {
           for(int j=0; j<elems.length; j++) {
               System.out.println("Thread 1. Сравниваю "+elems[i]+" и "+elems[j]);
               if( Compare(elems[i], elems[j])>0 ) {
                   String tmp = elems[i];
                   elems[i] = elems[j];
                   elems[j] = tmp;
               }
           }
       }
       System.out.println("Thread 1 завершил работу");
   }
    private int Compare(String o1, String o2)
    {
      boolean is_first_number = false;
      boolean is_second_number = false;

      double do1 = 0;
      double do2 = 0;
      try {
          do1 = Double.parseDouble(o1);
          is_first_number = true;
      } catch(Exception e) {}
      try {
          do2 = Double.parseDouble(o2);
          is_second_number = true;
      } catch(Exception e) {}
      if( is_first_number && is_second_number ) {
          return -1*Double.compare(do1, do2);
      }
      else if( is_first_number && !is_second_number ) {
          return -1;
      }
      else if( !is_first_number && is_second_number ) {
          return 1;
      }
      else {
          return Worker.CompareTwoString(o1, o2);
      }
    }


Worker.CompareTwoString
Код

      public static int CompareTwoString(String o1, String o2)
      {
//          if(o1.length() != o2.length()) {
//              return o1.length() - o2.length();
//          }
//          else {
              char[] a = o1.toCharArray();
              char[] b = o2.toCharArray();
              int len = a.length > b.length ? b.length : a.length;
              for(int i=0; i<len; i++) {
                  if( Character.isUpperCase(a[i]) && !Character.isUpperCase(b[i]) ) {
                      return -1;
                  }
                  else if( !Character.isUpperCase(a[i]) && Character.isUpperCase(b[i]) ) {
                      return 1;
                  } 
                  else {
                      return a[i] < b[i] ? 1 : -1;
                  }
              }
//          }
          return 1;
      }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)