java中统计JTextArea中的行数有两个方法的问题!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中统计JTextArea中的行数有两个方法的问题!相关的知识,希望对你有一定的参考价值。

public int getLineCount()java中我想统计JTextArea中的行数,查看了API后发现JTextArea中的两个方法:分别是public int getLineCount()和public int getRows(),但是我发现前者的确能返回出行数,但是后者却不能,那么后者是做什么用的呢?什么时候用呢?请讲解下.

首先看下,JTExtArea的其中一个构造方法
public JTextArea(int rows, int columns)
构造具有指定行数和列数的新的空 TextArea。创建默认模型,初始字符串为 null。
参数:rows - 行数 >= 0 columns - 列数 >= 0
这个里面设置的rows,可以通过getRows()这个方法获取到的。
换言之,你可以把rows想象成高,把columns想成宽(再不受其他组件影响的前提下,pack
方法显示面板,就可以看到你设置这2个参数的作用了)

getLineCount(),返回的是你文本区有多少行数据(输入了几次回车符号!)

多想,多看(API),多试(验证自己的想法)

有问题再追问,good luck!~
参考技术A 一、java获取文本文件的行数

public int getRows(File file)
LineNumberReader lnr = null;
int num = 0;
try
lnr = new LineNumberReader(new FileReader(file));
lnr.skip(Long.MAX_VALUE);
num = lnr.getLineNumber();
catch (FileNotFoundException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
finally
try
lnr.close();
catch (IOException e)
e.printStackTrace();


return ++num;

skip(Long.MAX_VALUE) Parameters: n - The number of characters to skip
java.io.LineNumberReader类是java.io.BufferedReader类的扩展,它封装了处理行号的额外能力,例如下例中得到不以“#”开头的行号:

public void parseFile(String filePath) throws IOException

LineNumberReader in = new LineNumberReader(new FileReader(filePath));
String line = "";
while ((line = in.readLine()) != null)
if (line.startsWith("#"))
continue;
else
throw new IOException("第" + in.getLineNumber() + "行丢了#号");


in.close();

行号0的意味着我们还没开始读入。如果在一个程序中我们每次读入一行,并输出该行和它的行号,行号将从1开始。
参考技术B 前者是返回文本区中所包含的行数,而后者是返回TextArea 中的总行数,自己运行下不就知道了哦;呵呵

如何计算子查询返回的行数?

【中文标题】如何计算子查询返回的行数?【英文标题】:How do I count the number of rows returned by subquery? 【发布时间】:2011-07-22 09:21:27 【问题描述】:

我想做这样的事情:

select count(*) from (select ...)

(就像在 SQL 中一样),但在 JPA 中。

关于我将如何做到这一点的任何想法?

【问题讨论】:

【参考方案1】:

这应该可以解决问题(如果您想使用 JPA 标准 API):

CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();  
CriteriaQuery<Long> query = cb.createQuery(Long.class);

Root<Entity> root = query.from(Entity.class);

//Selecting the count
query.select(cb.count(root));

//Create your search criteria
Criteria criteria = ...

//Adding search criteria   
query.where(criteria);

Long count = getEntityManager().createQuery(query).getSingleResult();

另一方面,如果你想使用 JP-QL,下面的代码应该可以解决问题:

//Add the where condition to the end of the query
Query query = getEntityManager().createQuery("select count(*) from Entity entity where...")
Long count = query.getSingleResult();

【讨论】:

问题是我想获取子查询的返回行数。似乎不可能,因为在JPA中不能像那样使用子查询 这根本没有回答具体问题。 OP 询问的是如何计算子查询的结果,而不是如何计算查询的结果。 如果返回零行则不起作用。 Hibernate 使用 javax.persistence.NoResultException【参考方案2】:

我也偶然发现了这个问题。我最终想执行以下 JPQL:

SELECT COUNT(u)
FROM (
   SELECT DISTINCT u
   FROM User u
   JOIN u.roles r
   WHERE r.id IN (1)
)

但这是不可能的,也不能使用标准 API。研究表明,这只是 JPA 中的一个设计限制。 JPA 规范规定子查询仅在 WHEREHAVING 子句中受支持(因此在 FROM 中不支持)。

用以下 JPQL 形式重写查询:

SELECT COUNT(u)
FROM User u
WHERE u IN (
   SELECT DISTINCT u
   FROM User u
   JOIN u.roles r
   WHERE r.id IN (1)
)

使用 JPA Criteria API,如下所示:

CriteriaQuery<Long> query = cb.createQuery(Long.class);
Root<User> u = query.from(User.class);
Subquery<User> subquery = query.subquery(User.class);
Root<User> u_ = subquery.from(User.class);
subquery.select(u_).distinct(true).where(u_.join("roles").get("id").in(Arrays.asList(1L)));
query.select(cb.count(u)).where(cb.in(u).value(subquery));
Long count = entityManager.createQuery(query).getSingleResult();
// ...

已经解决了我的功能需求。这也应该让您有足够的洞察力来解决您的特定功能需求。

【讨论】:

如果要统计聚合查询的结果,不能使用这种方法 @Martin 您建议从任意 CriteriaQuery 中使用什么方法来区分 DISTINCT COUNT? @svlada,我没有找到有效的解决方案,只能返回所有行并在应用服务器上统计它们。 @Martin 在这种情况下,我相信唯一的选择是进行纯 JDBC 查询。【参考方案3】:

使用以下 sn-p 计算给定条件查询的行数:

public static Query createNativeCountQuery(EntityManager em, CriteriaQuery<?> criteriaQuery) 
  org.hibernate.query.Query<?> hibernateQuery = em.createQuery(criteriaQuery).unwrap(org.hibernate.query.Query.class);
  String hqlQuery = hibernateQuery.getQueryString();

  QueryTranslatorFactory queryTranslatorFactory = new ASTQueryTranslatorFactory();
  QueryTranslator queryTranslator = queryTranslatorFactory.createQueryTranslator(
    hqlQuery,
    hqlQuery,
    Collections.emptyMap(),
    em.getEntityManagerFactory().unwrap(SessionFactoryImplementor.class),
    null
  );
  queryTranslator.compile(Collections.emptyMap(), false);

  String sqlCountQueryTemplate = "select count(*) from (%s)";
  String sqlCountQuery = String.format(sqlCountQueryTemplate, queryTranslator.getSQLString());

  Query nativeCountQuery = em.createNativeQuery(sqlCountQuery);

  Map<Integer, Object> positionalParamBindings = getPositionalParamBindingsFromNamedParams(hibernateQuery);
  positionalParamBindings.forEach(nativeCountQuery::setParameter);

  return nativeCountQuery;


private static Map<Integer, Object> getPositionalParamBindingsFromNamedParams(org.hibernate.query.Query<?> hibernateQuery) 
  Map<Integer, Object> bindings = new HashMap<>();

  for (var namedParam : hibernateQuery.getParameterMetadata().getNamedParameters()) 
    for (int location : namedParam.getSourceLocations()) 
      bindings.put(location + 1, hibernateQuery.getParameterValue(namedParam.getName()));
    
  

  return bindings;

【讨论】:

除了枚举和列表参数外,它可以工作

以上是关于java中统计JTextArea中的行数有两个方法的问题!的主要内容,如果未能解决你的问题,请参考以下文章

怎么用vba在excel中统计每列有多少行数

如何计算文本在 JTextArea 中的行数(以及每行中的列数)?

JTextArea中开启了自动换行怎么得到文本框中的行数

Laravel count 中的行数有很多关系

Linux中统计,检索和过滤文件内容的命令以及压缩归档命令(wc,grep,gzip,bzip2,

如何从JTextArea中删除旧文本,以便文档大小不超过阈值? (JAVA)