SashkoKlincharov

[Java][НП] - Насловна страница

Aug 27th, 2021
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.84 KB | None | 0 0
  1.  
  2.  
  3. Весникот FINKI Onion се одлучил да развие мобилна апликација за своите вести. Сите вести NewsItem се состојат од наслов, датум на објавување (објект од класата java.util.Date) и категорија. Категоријата на вести е објект од класата Category во која се чува само името на категоријата. Две категории се еднакви, ако се еднакви нивните имиња.
  4.  
  5. Во весникот засега постојат два видови вести кои се објавуваат и тоа:
  6.  
  7. Текстуални вести (TextNewsItem) за кој се чува дополнително текстот на веста,
  8. Мултимедијални вести (MediaNewsItem) за кој се чува url кон локацијата на мултимедијалната содржина (String) и бројот на погледи.
  9.  
  10. Сите вести се додаваат во класа FrontPage во која се чува листа од вести и поле од сите категории на вести кои постојат. За оваа класа треба да се имплементираат следните методи:
  11.  
  12. конструктор: FrontPage(Category[] categories);
  13. void addNewsItem(NewsItem newsItem) - додава нова вест во листата со вести,
  14. List<NewsItem> listByCategory(Category category) - прима еден аргумент рефернца кон објект од Category и враќа листа со сите вести од таа категорија.
  15. List<NewsItem> listByCategoryName(String category) - прима еден аргумент String името на категоријата и враќа листа со сите вести од категоријата со тоа име. Ако не постои категорија со вакво име во полето со категории, да се фрли исклучок од тип CategoryNotFoundException во кој се пренесува името на категоријата која не е најдена.
  16. препокривање на методот toString() кој враќа String составен од сите кратки содржини на вестите (повик на методот getTeaser()).
  17.  
  18. Во класите за вести треба да се имплементира методот за враќање на кратка содржина getTeaser() на следниот начин:
  19.  
  20. TextNewsItem:getTeaser() - враќа String составен од насловот на веста, пред колку минути е објавена веста (цел број минути) и максимум 80 знаци од содржината на веста, сите одделени со нов ред.
  21. MediaNewsItem:getTeaser() - враќа String составен од насловот на веста, пред колку минути е објавена веста (цел број минути), url-то на веста и бројот на погледи, сите одделени со нов ред.
  22.  
  23.  
  24.  
  25.  
  26. import java.util.*;
  27. import java.util.stream.Collectors;
  28.  
  29.  
  30. class CategoryNotFoundException extends Exception {
  31.  
  32. public CategoryNotFoundException(String message) {
  33. super(String.format("Category %s was not found", message));
  34. }
  35. }
  36.  
  37. class Category implements Comparable<Category> {
  38. private String name;
  39.  
  40. public Category(String name) {
  41. this.name = name;
  42. }
  43.  
  44. public String getName() {
  45. return name;
  46. }
  47.  
  48. @Override
  49. public String toString() {
  50. return String.format("Category: %s\n", getName());
  51. }
  52.  
  53. @Override
  54. public int compareTo(Category o) {
  55. return this.name.compareTo(o.name);
  56. }
  57. }
  58.  
  59.  
  60. abstract class NewsItem {
  61. private String title;
  62. private Date release_date;
  63. private Category category;
  64.  
  65. public NewsItem(String title, Date release_date, Category category) {
  66. this.title = title;
  67. this.release_date = release_date;
  68. this.category = category;
  69. }
  70.  
  71. public String getTitle() {
  72. return title;
  73. }
  74.  
  75. public Date getRelease_date() {
  76. return release_date;
  77. }
  78.  
  79. public Category getCategory() {
  80. return category;
  81. }
  82.  
  83. @Override
  84. public String toString() {
  85. return "NewsItem{" +
  86. "title='" + title + '\'' +
  87. ", release_date=" + release_date +
  88. ", category=" + category +
  89. '}';
  90. }
  91.  
  92. abstract String getTeaser();
  93. }
  94.  
  95. class TextNewsItem extends NewsItem {
  96. private String text;
  97.  
  98. public TextNewsItem(String title, Date release_date, Category category, String text) {
  99. super(title, release_date, category);
  100. this.text = text;
  101. }
  102.  
  103. public String getText() {
  104. return text;
  105. }
  106.  
  107. public void setText(String text) {
  108. this.text = text;
  109. }
  110.  
  111. @Override
  112. public String getTeaser() {
  113. StringBuilder desc = new StringBuilder();
  114. for (int i = 0; i < text.length(); i++) {
  115. if (i == 80)
  116. break;
  117. desc.append(text.charAt(i));
  118. }
  119. return String.format("%s\n%d\n%s",
  120. super.getTitle(),
  121. (int) (Calendar.getInstance().getTimeInMillis() - getRelease_date().getTime()) / 60000,
  122. desc);
  123. }
  124. }
  125.  
  126. class MediaNewsItem extends NewsItem {
  127. private String URL;
  128. private int number_views;
  129.  
  130. public MediaNewsItem(String title, Date release_date, Category category, String URL, int number_views) {
  131. super(title, release_date, category);
  132. this.URL = URL;
  133. this.number_views = number_views;
  134. }
  135.  
  136. public String getURL() {
  137. return URL;
  138. }
  139.  
  140. public int getNumber_views() {
  141. return number_views;
  142. }
  143.  
  144. @Override
  145. public String getTeaser() {
  146. return String.format("%s\n%d\n%s\n%d",
  147. super.getTitle(),
  148. (int) (Calendar.getInstance().getTimeInMillis() - getRelease_date().getTime()) / 60000,
  149. getURL(),
  150. getNumber_views());
  151. }
  152. }
  153.  
  154. class FrontPage {
  155. private List<NewsItem> newsList;
  156. private Category[] categories;
  157.  
  158. public FrontPage(Category[] categories) {
  159. newsList = new ArrayList<>();
  160. this.categories = categories;
  161. }
  162.  
  163. public void addNewsItem(NewsItem newsItem) {
  164. newsList.add(newsItem);
  165. }
  166.  
  167. public List<NewsItem> listByCategory(Category category) {
  168. return newsList
  169. .stream()
  170. .filter(each -> each
  171. .getCategory()
  172. .compareTo(category) == 0)
  173. .collect(Collectors.toList());
  174. }
  175.  
  176. public List<NewsItem> listByCategoryName(String category) throws CategoryNotFoundException {
  177. Category c = Arrays.stream(categories)
  178. .filter(each -> each.getName().equals(category))
  179. .findAny().orElse(null);
  180. if (c == null)
  181. throw new CategoryNotFoundException(category);
  182. return listByCategory(c);
  183. }
  184.  
  185. @Override
  186. public String toString() {
  187. StringBuilder sb = new StringBuilder();
  188.  
  189. for (NewsItem item : newsList) {
  190. sb.append(item.getTeaser()).append("\n");
  191. }
  192. return sb.toString();
  193. }
  194. }
  195.  
  196.  
  197. public class FrontPageTest {
  198. public static void main(String[] args) {
  199. // Reading
  200. Scanner scanner = new Scanner(System.in);
  201. String line = scanner.nextLine();
  202. String[] parts = line.split(" ");
  203. Category[] categories = new Category[parts.length];
  204. for (int i = 0; i < categories.length; ++i) {
  205. categories[i] = new Category(parts[i]);
  206. }
  207. int n = scanner.nextInt();
  208. scanner.nextLine();
  209. FrontPage frontPage = new FrontPage(categories);
  210. Calendar cal = Calendar.getInstance();
  211. for (int i = 0; i < n; ++i) {
  212. String title = scanner.nextLine();
  213. cal = Calendar.getInstance();
  214. int min = scanner.nextInt();
  215. cal.add(Calendar.MINUTE, -min);
  216. Date date = cal.getTime();
  217. scanner.nextLine();
  218. String text = scanner.nextLine();
  219. int categoryIndex = scanner.nextInt();
  220. scanner.nextLine();
  221. TextNewsItem tni = new TextNewsItem(title, date, categories[categoryIndex], text);
  222. frontPage.addNewsItem(tni);
  223. }
  224.  
  225. n = scanner.nextInt();
  226. scanner.nextLine();
  227. for (int i = 0; i < n; ++i) {
  228. String title = scanner.nextLine();
  229. int min = scanner.nextInt();
  230. cal = Calendar.getInstance();
  231. cal.add(Calendar.MINUTE, -min);
  232. scanner.nextLine();
  233. Date date = cal.getTime();
  234. String url = scanner.nextLine();
  235. int views = scanner.nextInt();
  236. scanner.nextLine();
  237. int categoryIndex = scanner.nextInt();
  238. scanner.nextLine();
  239. MediaNewsItem mni = new MediaNewsItem(title, date, categories[categoryIndex], url, views);
  240. frontPage.addNewsItem(mni);
  241. }
  242. // Execution
  243. String category = scanner.nextLine();
  244. System.out.println(frontPage);
  245. for (Category c : categories) {
  246. System.out.println(frontPage.listByCategory(c).size());
  247. }
  248. try {
  249. System.out.println(frontPage.listByCategoryName(category).size());
  250. } catch (CategoryNotFoundException e) {
  251. System.out.println(e.getMessage());
  252. }
  253. }
  254. }
  255.  
  256.  
  257. Sample input
  258.  
  259. Technology Science Sport
  260. 3
  261. Booksellers Resisting Amazon’s Disruption
  262. 15
  263. There is the slow-motion crackup of electronics showroom Best Buy. There is Amazon’s rumored entry into the wine business, which is already agitating competitors. And there is the merger of Random House and Penguin, an effort to create a mega-publisher sufficiently hefty to negotiate with the retailer on equal terms.
  264. 0
  265. Chinese Messaging App Gains Ground Elsewhere
  266. 28
  267. Chinese Internet companies have long struggled to establish their products beyond the country’s borders. In 2007 China’s dominant search engine, Baidu, announced an ambitious plan to break into the Japanese search engine market; as of last year, the company said it had lost more than $108 million trying.
  268. 1
  269. Shadow Marathon Quenches a Desire to Run
  270. 12
  271. Some called it the shadow race. Others the underground marathon.
  272. 0
  273. 2
  274. Protecting the City, Before Next Time
  275. 72
  276. http://www.nytimes.com/2012/11/04/nyregion/protecting-new-york-city-before-next-time.html?ref=science
  277. 1432
  278. 0
  279. After Getting Back to Normal, Big Job Is Facing New Reality
  280. 16
  281. http://www.nytimes.com/2012/11/04/nyregion/after-getting-back-to-normal-the-big-job-is-to-face-a-new-reality.html?ref=science
  282. 2783
  283. 1
  284. Science
  285.  
  286. Sample output
  287.  
  288. Booksellers Resisting Amazon’s Disruption
  289. 15
  290. There is the slow-motion crackup of electronics showroom Best Buy. There is Amaz
  291. Chinese Messaging App Gains Ground Elsewhere
  292. 28
  293. Chinese Internet companies have long struggled to establish their products beyon
  294. Shadow Marathon Quenches a Desire to Run
  295. 12
  296. Some called it the shadow race. Others the underground marathon.
  297. Protecting the City, Before Next Time
  298. 72
  299. http://www.nytimes.com/2012/11/04/nyregion/protecting-new-york-city-before-next-time.html?ref=science
  300. 1432
  301. After Getting Back to Normal, Big Job Is Facing New Reality
  302. 16
  303. http://www.nytimes.com/2012/11/04/nyregion/after-getting-back-to-normal-the-big-job-is-to-face-a-new-reality.html?ref=science
  304. 2783
  305.  
  306. 3
  307. 2
  308. 0
  309. 2
  310.  
Add Comment
Please, Sign In to add comment