Преобразование 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 + "]"; } } 
Intereting Posts
Есть ли способ избежать использования полного имени пакета в xml с пользовательскими представлениями (Android)? Документация по init.rc для мороженого сэндвич Показать вверх / назад на Android-экране с установленными предпочтениями? Андроид обнаруживает, активен ли диалог? Опубликовать данные объекта Json, чтобы получить ответ массива Json с помощью volley in android В AVD-эмуляторе, как увидеть папку sdcard? И установить apk в AVD? В чем разница между logcat и dmesg? Разделитель Android / разделитель линии в макете? Из памяти при использовании compresstojpeg на нескольких YuvImage по одному за раз Android Flip для веб-просмотра Предупреждение показывает, когда я использую Hash Map In android (используйте новый SparseArray <String>) В чем разница между действиями и намерениями в Android? Мягкая клавиатура вводит ручку события Вопрос о локализации Android AlarmManager работает только в ближайшем будущем