Сортировать массив строк - PullRequest
1 голос
/ 18 апреля 2011

У меня есть строковый массив со значениями

List<String> list = new ArrayList<String>();
list = {'name1','10','name2','2','name3','15','name4','7'}  

Я хочу отсортировать этот список, и вывод должен быть

list = {'name3','15','name1','10','name4','7','name2','2'}

Как мне этого добиться?

Ответы [ 9 ]

6 голосов
/ 18 апреля 2011

Вы тоже, кажется, живете в отрицании объекта . Использование списка для этих данных (или, по крайней мере, списка строк) просто использует неправильную структуру данных.

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

Лучшим решением было бы сохранить имя и числовое значение (возраст?) В каком-либо объекте и вести список таких объектов.

Затем этот список можно отсортировать, реализовав Comparable в этом классе или предоставив Comparator.

1 голос
/ 18 апреля 2011

Заявка принята:

import java.util.*;

class Test {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>(Arrays.asList("name1", "10",
                                                                "name2", "2",
                                                                "name3", "15",
                                                                "name4", "7"));

        List<NameNumPair> nps = new ArrayList<NameNumPair>();
        for (int i = 0; i < list.size(); i += 2)
            nps.add(new NameNumPair(list.get(i),
                    Integer.parseInt(list.get(i+1))));

        Collections.sort(nps);

        List<String> sortedList = new ArrayList<String>();
        for (NameNumPair np : nps) {
            sortedList.add(np.name);
            sortedList.add(np.num.toString());
        }

        System.out.println(sortedList);
    }

}

class NameNumPair implements Comparable<NameNumPair> {
    String name;
    Integer num;

    public NameNumPair(String name, int num) {
        this.name = name;
        this.num = num;
    }

    @Override
    public int compareTo(NameNumPair o) {
        return o.num.compareTo(num);
    }
}

Выход:

[name3, 15, name1, 10, name4, 7, name2, 2]
1 голос
/ 18 апреля 2011

Сначала вам нужно поместить комбинацию имени и значения в один объект вместо последовательных расположений в массиве.

Затем заставьте объект реализовать Comparable.

Наконец поместите объекты в Список и используйте Collections.sort для сортировки списка.

1 голос
/ 18 апреля 2011

Создайте свой класс

package org.life.java.stackoverflow.questions;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

//class for your data representation
class Data{
    private int no;
    private String data;

    public String getDaa() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public Data(int no, String data) {
        this.no = no;
        this.data = data;
    }

    public Data() {
    }


    @Override
    public String toString() {
        return "SortingDemo{" + "no=" + no + "data=" + data + '}';
    }

}

Создание компаратора и сортировка списка

public class SortingDemo {    

    public static void main(String[] args) {
    List<Data> listOfData = new ArrayList<Data>();
    listOfData.add(new Data(1,"DataFor one"));
    listOfData.add(new Data(15,"DataFor 15"));
    listOfData.add(new Data(10,"DataFor 10"));
    //defincation of Comparator for your case , which compares object based on the `no`
    Collections.sort(listOfData,new Comparator<Data>() {

            @Override
            public int compare(Data o1, Data o2) {
                return o2.getNo() - o1.getNo();
            }
        });
    }
}
0 голосов
/ 18 апреля 2011

Как уже говорили несколько человек, вы, вероятно, не хотите этого делать.

Но: если вы действительно хотите сделать это, как упражнение в переносе объектов Java, с полным пренебрежением к эффективности и хорошей практике программирования, вот способ, который максимально приближен к тому, что вы написали в вопросе. *

import java.util.*;

public class CrazySort {
    public static void main(String[] args) {
        List<String> list = Arrays.asList(new String[] {"name1","10","name2","2","name3","15","name4","7"});
        crazySort(list);
        System.out.println(list);
    }

    private static class StringPair implements Comparable<StringPair> {
        String s1, s2;
        StringPair(String p1, String p2) { s1 = p1; s2 = p2; }
        public int compareTo(StringPair o) { return Integer.parseInt(o.s2) - Integer.parseInt(s2); }
    }

    static void crazySort(final List<String> list) {
        List<StringPair> wrapper = new AbstractList<StringPair>() {
            public StringPair get(int i) { return new StringPair(list.get(i*2), list.get(i*2+1)); }
            public StringPair set(int i, StringPair p) {
                StringPair r = get(i); 
                list.set(i*2, p.s1); 
                list.set(i*2+1, p.s2); 
                return r;
            }
            public int size() { return list.size() / 2; }
        };
        Collections.sort(wrapper);
    }
}
0 голосов
/ 18 апреля 2011

Я бы порекомендовал вам использовать карту вместо списка, а затем вы можете сделать что-то вроде этого:

 public static void main(String[] args) throws Exception{
         HashMap<String, Integer> map = new HashMap<String, Integer>();
         map.put("name10", 2);
         map.put("name20", 1);
         Map<String, Integer> sortedMap = sortByValue(map);

         for (String key : sortedMap.keySet()) {
                System.out.println("key/value: " + key + "/"+sortedMap.get(key));
            }
        }

    static Map sortByValue(Map map) {
         LinkedList list = new LinkedList(map.entrySet());
         Collections.sort(list, new Comparator() {
              public int compare(Object o1, Object o2) {
                   return ((Comparable) ((Map.Entry) (o1)).getValue())
                  .compareTo(((Map.Entry) (o2)).getValue());
              }
         });

        Map result = new LinkedHashMap();
        for (Iterator it = list.iterator(); it.hasNext();) {
            Map.Entry entry = (Map.Entry)it.next();
            result.put(entry.getKey(), entry.getValue());
        }
        return result;
    } 

Сортировать картупо значениям (Java)

0 голосов
/ 18 апреля 2011
list = {'name3','15','name1','10','name4','7','name2','2'}

это определенно карта, которая вам нужна. Имя и ключ упорядочены по ключу в порядке убывания. Вы не сможете сортировать в порядке убывания, если не храните свои ключи как int или, по крайней мере, представляете «7» как «7» или «07», а «2» как «2» или «02».

0 голосов
/ 18 апреля 2011

Если предположить, что каждый namex (где x = 1, 2, 3, ...) уникален, чем вы можете решить свою проблему с помощью SortedMap

public static void main(String[] args) {
    SortedMap<String, Integer> sortedMap = 
        new TreeMap<String, Integer>();
    sortedMap.put("name1", Integer.valueOf(10));
    sortedMap.put("name2", Integer.valueOf(2));
    sortedMap.put("name3", Integer.valueOf(15));
    sortedMap.put("name4", Integer.valueOf(7));
    for (String key : sortedMap.keySet())
        System.out.println(key + " - " + sortedMap.get(key));
}
0 голосов
/ 18 апреля 2011

Посмотрите на TreeMap.Я думаю, это то, что вы ищете.

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