Intereting Posts
Run-as говорит, что «пакет неизвестен» после обновления Android до 4.3 Android, как получить выбранный элемент из управляемых данными счетчиков Метод Android onClick не работает на пользовательском представлении Как сделать ярлык Android «Главная» обойти приложение, которое оно указывает на историю? Как быстро сделать переход viewpager с фрагментом? Ошибка при импорте проекта в студию Android? Установить высоту значка панели действий, чтобы соответствовать высоте панели действий Получение исключения IO при создании файла на Android? Тип несоответствия: невозможно преобразовать из целого в boolean Локализация приложения Play Store Сохранить файл в Android с пробелами в имени файла Предотвратить показ веб-страницы «веб-страница недоступна» TextView StringIndexOutOfBoundsException и IndexOutOfBoundsException сбой в processToSupportEmoji Игра для Android продолжает взломать Как получить и изменить содержимое HTML из WebView с помощью Http Post

Преобразование HashMap в разделяемую строку

У меня есть класс ShoppingCartHelper и метод.

 private static Map<Product, ShoppingCartEntry> cartMap = new HashMap<Product, ShoppingCartEntry>(); 

И метод, который хранит продукт данных в cartMap:

 public static List<Product> getCartList() { List<Product> cartList = new Vector<Product>(cartMap.keySet().size()); for(Product p : cartMap.keySet()) { cartList.add(p); } return cartList; } 

В другом классе я вызываю сохраненные данные на карте:

 private List<Product> mCartList; mCartList = ShoppingCartHelper.getCartList(); 

И распечатать его в запятой:

 StringBuilder commaSepValueBuilder = new StringBuilder(); for ( int i = 0; i< mCartList.size(); i++) { commaSepValueBuilder.append(mCartList.get(i)); if ( i != mCartList.size()-1) { commaSepValueBuilder.append(", "); } } System.out.println(commaSepValueBuilder.toString()); 

Его напечатано как com.android.test@34566f3,com.android.test@29f9042

Как распечатать данные на карте в строке (для чтения человеком)?

Сделайте класс Product переопределив метод toString() или в вашей пользовательской логике, создайте строковый построитель, не добавляющий сам элемент, а его файлы, которые вы хотите получить в качестве текстового описания экземпляра продукта. Я имею в виду что-то вроде этого:

 //since I don't know, what is the Product class, I supposed it has a name filed commaSepValueBuilder.append(mCartList.get(i).getName()); 

Не используйте Vector , используйте ArrayList . Цитирование javadoc:

Если потоковая реализация не нужна, рекомендуется использовать ArrayList вместо Vector

Более короткая версия getCartList() :

 public static List<Product> getCartList() { return new ArrayList<>(cartMap.keySet()); } 

Что касается того, как создавать список продуктов, разделенных запятыми, лучший способ – реализовать метод Product toString() . Это также поможет при отладке.

 public class Product { // lots of code here @Override public String toString() { return getName(); // Assuming Product has such a method } } 

Затем вы можете использовать StringBuilder в простой for-each цикла:

 StringBuilder buf = new StringBuilder(); for (Product product : ShoppingCartHelper.getCartList()) { if (buf.length() != 0) buf.append(", "); buf.append(product); // or product.getName() if you didn't implement toString() } System.out.println(buf.toString()); 

В Java 8, который можно упростить, используя StringJoiner :

 StringJoiner sj = new StringJoiner(", "); for (Product product : ShoppingCartHelper.getCartList()) sj.add(product); System.out.println(sj.toString()); 

Вы можете переопределить метод toString в своем классе Product, как показано ниже,

 public class Product { //sample properties private String name; private Long id; public String getName() { return name; } public void setName(String name) { this.name = name; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Override public String toString() { return "Product{" + "name='" + name + '\'' + ", id=" + id + '}'; } 

}

Он может печатать строку в удобочитаемом формате.

Переопределите toString в классе Product и используйте потоки Java 8, чтобы сделать его более простым, как показано ниже:

  mCartList.stream().map(e -> e.toString()) .collect(Collectors.joining(",")); 

Применение:

 List<Product> mCartList = new ArrayList<>(); mCartList.add(new Product(1, "A")); mCartList.add(new Product(2, "B")); String commaSepValue = mCartList.stream().map(e -> e.toString()) .collect(Collectors.joining(",")); System.out.println(commaSepValue); 

Product.java

 final class Product { private final int id; private final String name; public Product(int id, String name) { this.id = id; this.name = name; } public String getName() { return name; } public int getId() { return id; } @Override public String toString() { return "Product [id=" + id + ", name=" + name + "]"; } }